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 讀回來比對,兩個各自獨立的函式庫互相驗證。
離線可用¶
跟這一區其他工具一樣,程式存進裝置之後沒有網路也能用。你掃的可能正是不想外流的東西,斷網時照樣能用就是最直接的證明。
要把這一頁帶著走,見離線閱讀。