← 全部文章

為什麼不要把敏感 JSON 貼到線上工具

JWT、API 金鑰、個人資料、資料庫匯出常被貼進線上格式化器。看清楚這些資料在伺服端會經歷什麼 —— 以及為何瀏覽器原生工具更安全。

一個開發者撞上解析錯誤,把 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 面板:

  1. 打開 DevTools(F12 或 Cmd+Option+I)。
  2. 切到 Network 分頁並勾選 Preserve log
  3. 把 JSON 貼進工具並觸發操作(格式化、驗證等)。
  4. 用 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.subtle API 不必繞過伺服器就能做。它正是「我解一下這段 payload 看看」而不必把密文送出去的正確 primitive。
  • 遮蔽 helper —— 除錯時,先把 JSON 通過一個小的遮蔽器,把已知敏感 key(password tokenemailssn)的值遮起來,再貼到任何地方。一個二十行的函式遠勝於在某個 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 不是加密 —— 為什麼編碼過的資料任何拿到字串的人都讀得到