QR code 读取器¶
什么时候用得上¶
对方传给你一张 QR code 的截图,或你在现场拍了墙上的一张。你想知道里面是什么,但不想用一个会把图片上传的 App,也不想直接拿相机扫了就跳转。
两个实际会遇到的:
- 停车缴费机上贴着一张 QR code,看起来跟原本的缴费码没两样。扫之前先确认里面是不是真的付款页面,主机名跟官方域名对不上,就知道那张贴纸有问题。假的付款页通常会直接要你输入卡号,那笔钱就进了别人的账户。
- 刚认识的人递来印着 QR code 的名片,说扫这个加我。先看一眼里面到底是联系方式还是别的东西,确认过再自己决定要不要加。
不会帮你打开链接¶
QR code 是钓鱼常用的载体。贴纸覆盖原本的付款码、海报上换一张图,内容看起来像官网、主机却是别的。相机 App 扫到就跳转,你根本来不及看。
所以解出来是网址时,主机名会独立标出来,并且刻意不提供打开按钮,确认过主机再自己贴进浏览器。
主机名里有非拉丁字母的话会显示成 xn-- 开头的形式,多半是用长得像的字母冒充别的域名,跟隐形字符检测提到的同形字是同一种手法。
认得的格式,跟拆出来的字段¶
QR code 里放得进的不只网址。扫到之后直接动作的 App 不会先让你看到里面有什么,下面的字段表会。
| 内容 | 拆出来会标的 |
|---|---|
| Wi-Fi 设置 | 网络名称、加密方式、密码、是不是隐藏网络 |
两步验证绑定(otpauth:) |
发行者、账号、验证方式 |
预先写好的邮件(mailto:) |
收件人、主题、正文 |
预先写好的短信(sms:) |
号码、正文 |
电话号码(tel:) |
号码 |
地理坐标(geo:) |
经纬度、精度换算成米 |
| 电子名片(vCard、MECARD) | 姓名、单位、号码、电子邮件 |
| 网址 | 主机、跟踪参数的数量 |
几个会另外提醒的组合:
- Wi-Fi 写的是
nopass:代表没有密码,连上去之后同一个网络里的人有办法看到你连了哪些主机。写WEP的话密码形同虚设,WEP加密早就被破解了。 otpauth:里有secret:那一串字符就是两步验证的密钥本身,取得的人可以自己算出验证码,第二道关卡等于没有。绑定验证器 App 时扫的就是这种带密钥的码,把截图留在相册里,跟把密码写在便条纸上没有两样。- 邮件或短信的内容已经填好:按下去只差一个发送。有些付费服务靠的就是一条你没细看的短信开通。
- 短网址:目的地要连上去才知道,工具不会自动替你连。
javascript:、data:开头:一按就在浏览器里执行,QR code 里出现它没有正当理由。
密码默认遮起来,原始内容不遮¶
字段表里的密码显示成 ••••••••,要看得按一下「显示」。扫码的场合旁边常常有人,默认摊开来不合理。
「原始内容」字段不遮,一字不差,目的是让你能确认解出来的到底是什么。截图给别人之前,先看清楚原始内容栏里有没有密码。otpauth: 的密钥是唯一的例外,字段表完全不列它。
解出来的东西还可以往下处理¶
如果是网址,跟踪参数的数量会一并显示,网址清理器可以拿掉这些参数再分享。
如果是一段文字,隐形字符检测可以看看里面有没有藏东西。
坐标精度字段是换算出来的:小数点后每多一位,指到的范围就缩小十倍,小数第四位在纬度方向大约是 11 米,指得到一栋建筑。QR code 里的坐标,跟浏览器透露了什么提到的定位,是同一种风险的两个来源。
用 Tor Browser 扫可疑的码¶
Tor Browser 的安全等级调到 Safest 会关掉 JavaScript,扫码功能就会停摆,而收到来路不明的 QR code 正是那篇文章建议把等级调高的场合。
先把图片存下来,切回 Standard 再读,读完调回去。解码不连外,图片全程留在设备上。
读不出来的时候¶
读不到的时候,解码不会只执行一次,会自动换几种方式重试:先用缩小的版本,接着裁掉外围把中间放大,再用原始尺寸,最后拉开黑白对比。多数照片在第一种就解完了,只有解不出来的才会往下走。
还是读不到的话,以下几件事按效果排序:
- 裁掉 QR code 以外的部分,效果最好。手机拍的照片动辄四千像素宽,墙上的码在画面里可能只占一小块,裁过之后它就占满整张图
- 靠近一点重拍,让码占画面一半以上
- 避开反光,光斑盖住定位图样就没得救
- 拍正一点。有点斜没关系,斜到快看不出方形就会失败
- 留白也是码的一部分,四周要留一圈空白,紧贴边缘裁掉会读不到
屏幕上的码直接截图,不要拍屏幕,拍出来的摩尔纹很难处理。
解码用的是谁的程序¶
解码交给 jsQR(Apache-2.0 授权,授权全文),原封不动放在 utils/vendor/ 底下。这一区用到的第三方组件都列在小工具首页。
解码要抓出 QR code 在画面里的位置、把歪斜的角度校正回来,还要还原被遮住或脏污的部分,比编码大得多。测试用生成器页面的 qrcode-generator 生成已知内容的码,再交给 jsQR 读回来比对,两个各自独立的函数库互相验证。
离线可用¶
跟这一区其他工具一样,程序存进设备之后没有网络也能用。你扫的可能正是不想外流的东西,离线也读得出来,图片就不必经过任何服务器。
要把这一页带着走,见离线阅读。