# NFC Reader

> 用 Android Chrome 讀寫 NFC 標籤：文字、網址、Wi-Fi。不用裝 App。覆蓋寫入救不回來；makeReadOnly 永久鎖死、沒有救援。建議先讀取並匯出備份再寫。不上傳。

- URL: https://bytescope.dev/zh-Hant/nfc-reader/
- Locale: zh-Hant · Also: [en](https://bytescope.dev/en/nfc-reader.md) · [ja](https://bytescope.dev/ja/nfc-reader.md)
- Runs: 不上傳、不記錄。標籤內容只留在這個分頁，離開就沒了。
- Requires: Chrome on Android only (Web NFC). No desktop browser and no iOS browser exposes NFC to web pages.
- Updated: 2026-09-08

## What it does

這一頁是線上 NFC 讀取器，也是不用裝 App 就能寫入 NFC 標籤的地方。它用 Web NFC 的 `NDEFReader`，在這個分頁裡跟標籤說話。不會上傳。能跑的是 Android 的 Chrome、HTTPS、而且要你點一下。iPhone 和桌面使用者照樣看得到說明、FAQ，還有一張誠實的支援表——工具不會因為你的瀏覽器沒有 API 就整頁消失。

### 標籤裡可以有什麼

`reading` 事件帶著 `serialNumber` 和 `message.records`。每筆 record 有 `recordType`、`mediaType`、`id`、`data`（DataView）、`encoding`、`lang`。`text` 顯示文字加上 lang 和 encoding。`url` / `absolute-url` 只有 `http:`、`https:`、`mailto:`、`tel:` 這種白名單才會做成連結——`javascript:`、`data:`、`vbscript:` 維持純文字，並標成不安全。`mime` 是 `mediaType` 加上跟 hex editor 同一套 hex。`application/vnd.wfa.wsc` 是 Wi-Fi 的 WPS 憑證：SSID、認證、加密；Network Key 預設遮蔽，要點一下才顯示，並警告畫面上會出現明文密碼。`unknown` 和外部型別（`example.com:foo`）走 hex。認不出來的 bytes 一律 hex，不會猜一個型別。

### 寫入會覆蓋。鎖定是永久的

`ndef.write(message, { overwrite: true })` 會蓋掉標籤上現有的內容。除非你已經從讀取結果匯出備份，否則舊內容救不回來。`ndef.makeReadOnly()` 會把標籤永久鎖死。沒有救援——沒有重設、沒有燒錄器能救。兩個動作都藏在預設關閉的危險區後面，接著是跟 fuse 寫入同一套「準備 → 確認」。鎖定還要你打字輸入 `LOCK`。掃描過程絕不會寫入。讀是讀，寫是寫。

### 還沒讀到，不是空的

手機湊上去、什麼都還沒出現，是「還沒讀到」，不是「標籤是空的」。空的 NDEF（零筆 record）是另一種結果。`readingerror` 是「這張標籤讀不到」。`NotAllowedError` 是權限或標籤已被鎖死，不是沒有標籤。`permissions.query({ name: "nfc" })` 若 throw，顯示 `unknown`，不會寫成 `denied`。

### 只有 Android Chrome

Web NFC 的規格舞台是 Android Chrome。桌面 Chrome 沒有 `NDEFReader`。iOS Safari 也沒有。Edge 在 Android 上這裡沒實測，格子會標未實測。能力偵測在掛載之後才做（`"NDEFReader" in window`）。請相信上面那列現場結果，不要背版本表。

## Limits

Does not read bank cards, transit cards or passports, and does not clone tags; it reads and writes NDEF records on NFC Forum tags.

ndef.makeReadOnly() 會把這張標籤永久鎖死，之後再也無法寫入。這個動作不可逆。

## FAQ

### 哪些瀏覽器能在這裡讀 NFC 標籤？

Android 的 Chrome，而且要 HTTPS、還要你點一下。桌面 Chrome、Firefox、Safari（含 iPhone）沒有 Web NFC。那些瀏覽器照樣看得到說明、FAQ 和支援表——不會 early return null。

### 會上傳標籤裡的內容嗎？

不會。bytes 只留在這個分頁。沒有把內容打到伺服器。匯出備份是你自己存到手機裡的檔。關掉分頁，這次讀到的就沒了。

### 我點了掃描，什麼都沒發生。標籤是空的嗎？

不是。那是等待中：`reading` 事件還沒來。空的標籤是「有 `reading`、但沒有 record」。這兩句在這一頁不會混在一起。

### makeReadOnly 做什麼？救得回來嗎？

它會把標籤永久鎖死。之後再也無法寫入。完全沒有救援。這一頁不會把這句話說軟。你得打開危險區、打字輸入 LOCK、準備、再確認。除非你打定主意讓這張標籤再也不能寫，否則不要按。

### 標籤上的網址是 javascript: 開頭。會變成連結嗎？

不會。只有白名單裡的 scheme 會做成 `<a href>`。`javascript:`、`data:`、`vbscript:`、編碼變體，還有 `//` 開頭的 protocol-relative，都維持文字並標成不安全。標籤內容是不受信任的輸入：沒有 `innerHTML`，沒有 `eval`。

### 標籤裡有我的 Wi-Fi 密碼。這一頁會顯示出來嗎？

Network Key 一開始是遮蔽的。點一下才顯示，並警告畫面上會出現明文密碼。匯出備份會包含它——少了密碼的備份不算備份。把那個檔當秘密保管。

## Related tools

- [Web ADB Toolkit](https://bytescope.dev/zh-Hant/web-adb.md) — 同一群人：用這個分頁透過 USB 跟 Android 手機說話。
- [Hex Viewer / Editor](https://bytescope.dev/zh-Hant/hex-editor.md) — 同一套 offset／16 bytes／ASCII，拿來看檔案而不是標籤。
- [Clipboard Inspector](https://bytescope.dev/zh-Hant/clipboard-inspector.md) — 檢查不會離開這個分頁的不可信 bytes——剪貼簿，不是 NFC。
