一個開發者撞上解析錯誤,把 API 回應裡的 JSON 複製出來,貼到 Google 搜出來的第一個線上格式化工具。那段 JSON 裡含有使用者 ID、Email、session token,或者一份內部設定檔。這每天都在每個工程團隊裡發生好幾十次。本文說明這究竟會帶來哪些風險 —— 以及為什麼瀏覽器原生工具能消除這些風險。
線上 JSON 工具裡最後會出現哪類資料
實務上,開發者會貼進去的就是當下讓他們頭痛的東西。也就是說:
- JWT token —— 內含使用者身分 claim、角色、過期時間。簽章可以防竄改,但 payload 是 Base64url 編碼的明文:任何拿到你 token 日誌的人都能讀出每個欄位。
- 含 PII 的 API 回應 —— 姓名、Email、電話、生日、地址。來自面向顧客 API 的一頁搜尋結果可能含有上百筆記錄。
- 設定檔 —— 資料庫連線字串、第三方 API key、feature flag 設定、內部服務 URL。
- 資料庫匯出 —— 整張資料表的 JSON dump,有時為了 debug 產生出來、原封不動地貼進去。
- 內部業務資料 —— 定價規則、合約條款、未發佈的產品資料,沒有公開分級但同樣敏感。
當下沒有任何一 項會讓人覺得敏感。開發者想搞清楚結構,不是要分享資料。但把它貼到線上工具這個動作,跟把它送給第三方在技術上沒有區別。
把資料送到線上工具後會發生什麼
多數線上 formatter、validator、diff 工具的運作方式是把你的輸入送到某個伺服端 endpoint、在那邊處理、再把結果送回來。即使是聲稱「客戶端」的工具,也可能為了日誌、analytics 或錯誤追蹤而送出資料。資料沿這條路徑會經歷的事情如下。
伺服端日誌
很多框架預設會把 request body 寫進 web 伺服器日誌。一次 POST 你 JSON payload 的請求可能最後落在:
- 存在磁碟或某個日誌服務裡的應用日誌(Datadog、Splunk、CloudWatch)
- 錯誤追蹤工具(Sentry、Bugsnag)—— 尤其當解析失敗時
- 「analytics」或「usage」資料表裡的一筆紀錄
- 工具營運方都不見得會監看的 CDN 或 load balancer 存取日誌
日誌保留政策落差很大。有的工具留 90 天,有的無限期保留。任何情況下,營運方 —— 以及任何取得他們系統權限的人 —— 都能讀到你送出的內容。
第三方 analytics
許多線上工具會嵌入第三方 JavaScript 做 analytics 或廣告。這些 script 可以觀察網路請求、表單送出、輸入事件。如果工具把資料送到自己的伺服器,analytics 那一層也看得到這次 HTTP 交易。
快取與 CDN 儲存
有些工具會以輸入內容為 key 做快取。兩個使用者貼相同 JSON,第二個就拿到了快取的回應。輸入可能在快取裡留數小時甚至幾天。極端情況下,設定錯誤的快取曾讓使用者的提交可以透過一個可預測的 URL 公開存取。
搜尋引擎索引
會產生可分享 permalink(含或指向你格式化後 JSON 的 URL)的 formatter,歷史上出現過輸出被搜尋引擎爬走的情況。在搜尋引擎裡搜 內部設定檔裡一段顯眼的字串,結果在某個 JSON formatter 的網域裡找到 —— 那場面非常難受。
法規風險
如果你的組織在 GDPR、HIPAA、CCPA 或類似框架下處理個人資料,把使用者的資料貼到第三方線上工具,可能就構成未授權的資料傳輸 —— 即使是無意,即使那個工具口碑很好。法規不會區分有意分享與工具選擇上的粗心。它問的問題是:個人資料有沒有離開授權處理範圍?
對 HIPAA 涵蓋的單位而言,把受保護的健康資訊送到一個沒簽 Business Associate Agreement(BAA)的第三方服務,不論資料有沒有被濫用,都屬於必須通報的違規。
瀏覽器原生工具的運作方式有何不同
現代瀏覽器有能力在 JavaScript 引擎裡完整跑複雜邏輯 —— 解析、驗證、diff、格式化、編碼 —— 完全不需要送網路請求。建立在這個模型上的工具,行為就像是一個剛好透過 web 派發的本機應用。
當你把 JSON 貼到瀏覽器原生工具裡:
- 文字進入你瀏覽器記憶體裡的一個 JavaScript 變數。
- 一個 parser(也是 JavaScript)在同一個分頁裡處理它。
- 輸出被渲染進 DOM。
- 沒有任何 HTTP 請求把你的資料當 payload 送到任何伺服器。
資料從來沒離開你的電腦。它沒辦法被日誌、快取或索引,因為它從未被傳輸過。
如何驗證一個工具真的是本機跑
像「我們絕不儲存你的資料」這類說法很常見,又無法從外面驗證。唯一可靠的檢查是你瀏覽器的 Network 面板:
- 打開 DevTools(F12 或 Cmd+Option+I)。
- 切到 Network 分頁並勾選 Preserve log。
- 把 JSON 貼進工具並觸發操作(格式化、驗證等)。
- 用 XHR/Fetch 過濾請求。如果有任何出站請求把你的輸入當 payload 帶出去,這個工具就 不是客戶端。
一個真正本機的工具不會出現任何帶著你資料的出站 POST 或 fetch。你可能看到靜態資源(CSS、JS 檔)請求或 analytics ping,但裡頭都不會有你的 JSON payload。
// 本機工具會做的事 —— 沒有網路呼叫:
const result = JSON.parse(userInput); // 在瀏覽器裡執行
render(result); // 更新 DOM
// 伺服端工具會做的事:
const res = await fetch('/api/format', {
method: 'POST',
body: JSON.stringify({ input: userInput }), // 你的資料離開了這台電腦
});實用模式:BAA、WebCrypto 與遮蔽 helper
三種模式能堵掉大多數剩餘風險:
- 與 HIPAA 相關工作要備有 BAA(Business Associate Agreement) —— 如果你的團隊處理受保護健康資訊,任何接觸這些資料的第三方服務都需要事先簽好 BAA。這就是為什麼把 PHI 貼到隨機 formatter(即使它「在本機跑」)既是技術問題也是文件問題。
- 客戶端 WebCrypto —— 當你真的需要在瀏覽器裡做雜湊、簽章、加解密或產生金鑰時,標準的
crypto.subtleAPI 不必繞過伺服器就能做。它正是「我解一下這段 payload 看看」而不必把密文送出去的正確 primitive。 - 遮蔽 helper —— 除錯時,先把 JSON 通過一個小的遮蔽器,把已知敏感 key(
password、token、email、ssn)的值遮起來,再貼到任何地方。一個二十行的函式遠勝於在某個 analytics 工具的請求日誌裡發現 token。
團隊層級值得制定的政策
個人意識能做的有限。一份輕量級政策能補上:
- 貼上之前先分級。 如果 JSON 含姓名、Email、ID、token 或金鑰 —— 那就是敏感的。請用本機工具或經核可的內部工具。
- 維護一份核可工具清單。 一份簡短、已驗證為本機優先的工具清單,比一句空泛的「請小心」好執行得多。
- 永遠不要在 debug 階段分享正式環境憑證。 任何曾經貼進線上工具的 token 或 key,無論工具看起來多安全,都要輪換掉。
- 用脫敏樣本除錯。 貼上之前把真實使用者值換成合成資料。含
"email": "test@example.com"的結構,對 debug 一個解析錯誤跟真實的 email 一樣有用。
常見問題
把敏感 JSON 貼到線上工具安全嗎?
只有當工具完全在你的瀏覽器裡處理時才安全。伺服端 formatter 可以把你的輸入日誌、快取、索引下來 —— 而把 PII 貼到第三方那一刻可能就違反 GDPR 或 HIPAA,無論本意如何。
怎麼確認 JSON 工具是不是本機跑?
打開 DevTools → Network,勾「Preserve log」,跑一次操作。如果沒有任何出站請求把你的輸入帶出去,就是客戶端工具。靜態資源與 analytics 請求沒問題;POST 你 JSON 的請求才有問題。
我已經把一個 token 貼進線上工具了,怎麼辦?
輪換它。任何接觸過第三方工具的憑證或金鑰都視為已洩漏,即使工具看起來很正派。記得 Base64 編碼過的 token 仍然是明文。
我們團隊怎麼從根本上避免這件事?
用瀏覽器原生工具,維護核可工具清單,並用脫敏樣本資料("email": "test@example.com")debug,而不是真實紀錄。
fixjson.org 做了什麼
fixjson.org 上的每個工具 —— JSON 修復、JSON diff、YAML formatter、JSON Stringify、Base64 編/解碼、URL 解碼 —— 都完全在你的瀏覽器裡執行。parser、diff 引擎、formatter 全是在本機跑的 JavaScript。你可以在 Network 分頁裡確認:沒有任何帶你輸入的 POST 請求。
網站從 CDN 一次性載入靜態資源(HTML、CSS、JS)。之後它能離線運作。沒有任何輸入被送到任何伺服器。沒有任何資料被日誌、儲存或分享。
- JSON Fix —— 在客戶端修復與格式化非法 JSON
- JSON Diff —— 在客戶端比對兩份 JSON 或 YAML 文件
- Base64 編碼與解碼 —— 檢視 JWT payload 與 data URI 而不把它們送出去
- URL Decode —— 在本機做 query string 的百分號解碼
- Base64 不是加密 —— 為什麼編碼過的資料任何拿到字串的人都讀得到