跳轉到

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 讀回來比對,兩個各自獨立的函式庫互相驗證。

離線可用

跟這一區其他工具一樣,程式存進裝置之後沒有網路也能用。你掃的可能正是不想外流的東西,斷網時照樣能用就是最直接的證明。

要把這一頁帶著走,見離線閱讀