·阅读时间 6 分钟

二维码重定向劫持:看不见的中间人

你的二维码能用时,中间人不可见。等它坏了,已经太晚。理解重定向模型是避开它的第一步。


你扫描过的每一个动态二维码,都牵涉一个你从未选择的第三方。在手机摄像头和目标网站之间,属于二维码服务商的重定向服务器,悄悄地转发了请求。大多数用户从未察觉。这正是关键。

本文解释重定向劫持在实践中是什么样子、中间人到底在做什么,以及有什么在受影响。

重定向序列

扫描一个指向 https://shop.example.com 的静态二维码时:

  1. 摄像头读取二维码
  2. 操作系统识别为 URL
  3. 浏览器打开 https://shop.example.com

三步。没有第三方。

扫描指向同一目的地的动态二维码时:

  1. 摄像头读取二维码,它编码的是类似 https://qr-provider.com/r/x7n2 的地址
  2. 操作系统打开该 URL
  3. qr-provider.com 收到请求,将其记录下来,在数据库里查找 x7n2
  4. qr-provider.com 发出 301 或 302 重定向到 https://shop.example.com
  5. 浏览器跟随重定向,到达真实目的地

五步。第三步多了一方——你从未同意、从未付费、也看不见的一方。

中间人能得到什么

每一次扫描都会产生一条服务器日志,包含:

  • 扫描时间戳
  • 扫描者的 IP 地址
  • user-agent 字符串(设备、操作系统、浏览器)
  • Referrer 头(扫描者来源,如适用)
  • Accept-Language 头(语言偏好)

据此,服务商可以推断:大致地理位置、设备类型、操作系统版本;聚合起来还能推断长期的扫描模式。对客户这被包装成「分析」。对扫描你的码的那些人——他们从未同意——这同时也是监视。

中间人能做什么

更改目的地

重定向目的地保存在服务商的数据库里。二维码的主人通常可以通过面板编辑。这被当作功能卖,对某些场景确实是。但这也意味着二维码已不再是它看起来的样子。物理印刷品说「扫码访问我们的网站」。实际行为是服务商数据库今天的记录。

关闭重定向

如果主人的订阅到期、账户被关闭或违反了服务条款,重定向可以被移除。二维码的每一份印刷副本即刻失效。扫描者看到的是通用错误页面或 404。

插入中间页

某些服务商在最终重定向之前,把动态二维码的扫描导到自己品牌的中间页——展示广告、索取同意、收集邮箱。二维码主人通常没有签过这种协议。这是后来随着服务商更激进地变现而加上的。

转卖或泄露扫描数据

扫描日志是有价值的。它们曾被卖给数据分析中介、用于训练广告定向模型——并且在至少几起有记录的事件里——因服务商被攻破而泄露。你的客户扫了一份菜单;现在他们的设备指纹出现在一个泄漏数据集中。

为什么用户永远察觉不到

现代浏览器自动跟随重定向。没打开开发者工具的话,看不到中间跳转。扫描感觉是瞬时的,因为重定向很快(在它还能用的时候)。从用户视角看,动态二维码的行为与静态码完全一样。

直到重定向服务器失效。那时体验会突然分叉——但那时二维码已经印在上千个物体上了。

安全隐患

重定向服务器是每一个依赖它的二维码的单点故障。三种值得考虑的攻击面:

  • 账户被接管。 如果攻击者获得二维码主人在服务商那里的账号权限,他可以把每一个二维码指向一个钓鱼页面。客户扫描物理码期望看到餐厅菜单;他们却落在一个窃取凭据的克隆登录页上。
  • 服务商本身被攻破。 如果二维码服务商自己被攻破,每一个在流通中的动态二维码都有可能被指向攻击者控制的内容。这不是理论——多个 QR-as-a-service 服务商公开过被攻破的事件。
  • 服务商的 DNS 或 TLS 故障。 如果重定向域名停止解析,或 TLS 证书过期,依赖它的每一个二维码都会失败。不是恶意攻击——只是二维码主人无法控制的普通运维风险。

静态二维码不存在这些失效方式,因为扫描与目的地之间没有第三方服务器。

如何检查自己是否在扫描重定向

使用一个会在跳转前显示解码内容的扫描器——我们的 网页扫描器 就是这样做的。扫描二维码并查看解码 URL。如果它是你的真实目的地,码是静态的。如果是像 qrco.de/xyz 之类你不认识的短域名——那就是重定向,中间坐着一个第三方。

替代方案

生成直接编码目的地的二维码。没有第三方服务器、没有重定向日志、没有订阅。完整对比见 静态与动态二维码,中间人模型为什么主导行业见 二维码骗局的真相

或者直接 生成一个静态二维码,从此不再担心。


准备好使用静态二维码了吗?

在浏览器里直接生成——无需账户、无跟踪、无订阅。你创建的内容归你所有。