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 读回来比对,两个各自独立的函式库互相验证。
离线可用¶
跟这一区其他工具一样,程序存进设备之后没有网络也能用。你扫的可能正是不想外流的东西,断网时照样能用就是最直接的证明。
要把这一页带着走,见离线阅读。