跳转至

QR code 读取器

什么时候用得上

对方传给你一张 QR code 的截图,或你在现场拍了墙上的一张。你想知道里面是什么,但不想用一个会把图片上传的 App,也不想直接拿相机扫了就跳转。

这一页在你的浏览器里解,图片不离开设备。

这一页不会帮你打开链接

QR code 是钓鱼常用的载体。贴纸覆盖原本的付款码、海报上换一张图,内容看起来像官网、主机却是别的。相机 App 扫到就跳转,你根本来不及看。

所以解出来是网址时,这一页会把主机名独立标出来,并且刻意不提供打开按钮。确认过那个主机再自己贴进浏览器。

主机名里有非拉丁字母的话会显示成 xn-- 开头的形式。那多半是用长得像的字母冒充别的域名,跟隐形字符检测提到的同形字是同一回事。

认得的格式,跟拆出来的字段

QR code 里放得进的不只网址。扫到之后直接动作的 App 不会先让你看到里面有什么,这一页会。

内容 拆出来会标的
Wi-Fi 设置 网络名称、加密方式、密码、是不是隐藏网络
两步验证绑定(otpauth: 发行者、账号、验证方式
预先写好的邮件(mailto: 收件人、主题、正文
预先写好的短信(sms: 号码、正文
电话号码(tel: 号码
地理坐标(geo: 经纬度、精度换算成米
电子名片(vCard、MECARD) 姓名、单位、号码、电子邮件
网址 主机、跟踪参数的数量

几个会另外提醒的组合:

  • Wi-Fi 写的是 nopass:那个网络没有密码。连上去之后,同一个网络里的人有办法看到你连了哪些主机。写 WEP 的话密码形同虚设,那个加密方式早就被破了。
  • otpauth: 里有 secret:那一串就是两步验证的密钥本身。取得的人可以自己算出验证码,第二道关卡等于没有。你自己在绑定验证器 App 时扫的就是这种码,那张图留在相册里跟把密码写在便条纸上是同一回事。
  • 邮件或短信的内容已经填好:按下去只差一个发送。有些付费服务靠的就是一条你没细看的短信开通。
  • 短网址:目的地要连上去才知道,这一页不会替你连。
  • javascript:data: 开头:一按就在浏览器里执行,QR code 里出现它没有正当理由。

密码默认遮起来,原始内容不遮

字段表里的密码显示成 ••••••••,要看得按一下「显示」。扫码的场合旁边常常有人,默认摊开来不合理。

上面那一格原始内容不遮,一字不差。那是这个工具的承诺:你要能确认解出来的到底是什么。所以要把这一页截图给别人之前,先看清楚那一格里有没有密码。otpauth: 的密钥是唯一的例外,字段表完全不列它。

解出来的东西还可以往下处理

如果是网址,这一页会数出它带了几个跟踪参数,网址清理器可以拿掉那几个再分享。

如果是一段文字,隐形字符检测可以看看里面有没有藏东西。

坐标的精度那一栏是换算出来的:小数点后每多一位,指到的范围就缩小十倍。小数第四位在纬度方向大约是 11 米,指得到一栋建筑。这跟浏览器透露了什么那一页说明的位置泄漏是同一件事的两面。

读不出来的时候

QR code 有容错能力,但照片太模糊、角度太斜、周围留白不够都会失败。裁掉 QR code 以外的部分通常最有效。

解码用的是谁的程序

解码交给 jsQR(Apache-2.0 授权),原封不动放在 utils/vendor/ 底下,授权全文也在同一个目录。

那要处理定位、透视校正与纠错还原,比编码更大的工程。测试用生成器那边的 qrcode-generator 生成已知内容的码,再交给 jsQR 读回来比对,两个各自独立的函式库互相验证。

离线可用

跟这一区其他工具一样,程序存进设备之后没有网络也能用。你扫的可能正是不想外流的东西,断网时照样能用就是最直接的证明。

要把这一页带着走,见离线阅读