跳转至

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 读回来比对,两个各自独立的函数库互相验证。

离线可用

跟这一区其他工具一样,程序存进设备之后没有网络也能用。你扫的可能正是不想外流的东西,离线也读得出来,图片就不必经过任何服务器。

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