預設系統文字 JSON 序列化中的潛在風險
System.Text.Json 函式庫已成為大多數現代 .NET 應用程式的預設函式庫。它高效、輕量級,並且與 ASP.NET Core 深度整合。但正是這些使其易於使用的預設設置,也帶來了不易察覺的安全風險。 預設情況下,System.Text.Json 序列化會自動序列化所有公共屬性,即使是包含敏感資料(例如令牌或內部識別碼)的屬性也不例外。開發人員通常為了提高速度而依賴這些預設設置,卻忽略了這可能會在 API 回應中暴露機密資訊(jsonserializer)。
⚠️此範例不安全,僅供學習交流之用。請勿用於生產環境。
public class UserProfile { public string UserName { get; set; } public string Email { get; set; } public string SessionToken { get; set; } // Sensitive field } var json = JsonSerializer.Serialize(userProfile); Console.WriteLine(json); // Output: {"UserName":"alex","Email":"alex@example.com","SessionToken":"eyJhbGciOi..."} 這種 jsonserializer 行為暴露了 會話令牌 因為所有公共屬性都會自動序列化。
安全版本:
public class UserProfile { public string UserName { get; set; } public string Email { get; set; } [JsonIgnore] // Prevent serialization of sensitive fields public string SessionToken { get; set; } } 教育筆記: 一律使用 [JsonIgnore] 對於敏感屬性,或設計單獨的 DTO,其中只包含用於序列化的欄位。
JsonSerializer 如何在無警告的情況下擴大風險敞口
System.Text.Json 中的 JsonSerializer 並不會止步於表面層。它會遞歸地遍歷嵌套的物件、集合和枚舉值,序列化它能夠存取的所有內容。 如果沒有明確排除,這很容易導致巢狀資料洩露,尤其是在內部物件包含令牌、識別碼或會話金鑰時。
⚠️此範例不安全,僅供學習交流之用。請勿用於生產環境。
public class AuthData { public string AccessToken { get; set; } // Sensitive } public class ApiResponse { public string Message { get; set; } public AuthData AuthInfo { get; set; } // Nested object } var json = JsonSerializer.Serialize(new ApiResponse { Message = "OK", AuthInfo = new AuthData { AccessToken = "abc123" } }); Console.WriteLine(json); // Output: {"Message":"OK","AuthInfo":{"AccessToken":"abc123"}} 巢狀物件使得系統文字 JSON 序列化包含敏感資訊。 訪問令牌 自動。
安全版本:
public class AuthData { [JsonIgnore] // Prevent exposure of sensitive tokens public string AccessToken { get; set; } } public class ApiResponse { public string Message { get; set; } public AuthData AuthInfo { get; set; } } var options = new JsonSerializerOptions { DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault, WriteIndented = false }; var json = JsonSerializer.Serialize(apiResponse, options); 教育筆記: 始終定義 JsonSerializerOptions 明確檢查巢狀類型是否有意外資料外洩。
API 和微服務在現實世界中的影響
在實際的 .NET 應用程式中,這些序列化風險通常在部署後才會顯現。自動化、DTO 重複使用以及預設的 jsonserializer 行為的結合,加劇了這些風險。 不安全的序列化導致資料外洩的常見模式:
- 在 API 回應中直接重複使用 EF Core 實體。
記錄包含身份驗證資料的序列化物件。 - 內部服務與公共服務之間的共享模式 CI/CD pipelines.
⚠️此範例不安全,僅供學習交流之用。請勿用於生產環境。
// Logs the full object, including sensitive fields _logger.LogInformation("Response: {data}", JsonSerializer.Serialize(result)); 如果 導致 包含 密碼哈希 or 會話令牌這些現在都儲存在 CI/CD 日誌,違反 最小特權原則。 切勿在下列位置揭露真實令牌、憑證或內部 URL: pipelines.
安全版本:
var options = new JsonSerializerOptions { IgnoreReadOnlyProperties = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull }; // Sanitize before serialization result.SessionToken = null; _logger.LogInformation("Response: {data}", JsonSerializer.Serialize(result, options)); 教育筆記: 在記錄日誌之前,請對敏感欄位進行減敏或置空處理,並始終使用安全模式。 JsonSerializerOptions 審計輸出的預設值。
面向開發人員的安全序列化實踐
開發者應將 system.text.json 的預設值視為一種便利層,而非安全策略。安全的系統文字 JSON 序列化意味著掌控哪些內容會離開你的應用程式。
實用防禦
- 明確約定: 為 API 回應建立專用 DTO,切勿直接序列化 EF 或領域實體。
- 配置全域選項: 使用 JsonSerializerOptions.DefaultIgnoreCondition 以及 物業命名政策.
- 在斷裂前, [JsonIgnore] 或轉換器: 隱藏或轉換敏感資料。
- 驗證輸出結果: 檢查測試中實際的序列化響應。
- 自動檢查: 在序列化驗證中加入 CI/CD.
迷你預防檢查清單
- 檢查所有使用 System.Text.Json 序列化的類
- 標記金鑰或憑證 [JsonIgnore]
- 在以下位置定義全域安全預設值 程序.cs or 啟動文件
- 避免在日誌中直接序列化
- 將序列化暴露測試納入您的計劃中 CI/CD pipeline
教育筆記: 安全序列化旨在限制風險暴露,而非增加複雜性。應明確序列化過程並使其可測試。
使用自動掃描偵測不安全的序列化-System.Text.Json
自動掃描 CI/CD 有助於偵測對 System.Text.Json 和 JsonSerializer 的風險使用。靜態分析工具可以辨識:
- 模型缺失 [JsonIgnore].
- DTO中暴露的敏感場。
- 不安全的全域預設值(例如,缺少忽略條件)。
例 Pipeline 勾選
# Never expose real tokens, credentials, or internal URLs in pipelines - name: Run serialization security checks run: dotnet xygeni validate --rules serialization --fail-on-risk 教育筆記: 整合 靜態檢查 進入你的 CI/CD 確保對所有建置版本進行一致的系統文字 JSON 序列化控制。
Xygeni Code Security 增強 .NET 序列化安全性
Xygeni Code Security 提供對 .NET 中 System.Text.Json 的不安全預設值和 JsonSerializer 的濫用進行深度檢測。
它可以識別以下模式:
- 敏感字段預設進行序列化。
- JSON 資料日誌記錄不安全。
- 失踪 [JsonIgnore] 屬性。
- 系統文字 JSON 序列化選項配置錯誤。
通過集成 Xygeni 加到 pre-commit hooks, CI/CD pipelines,或者說 PR 閘,可以在易受攻擊的序列化模式合併之前阻止它們。 它透過將序列化錯誤配置轉換為可強制執行的安全性策略,來完善您現有的 DevSecOps 流程。
教育性提示:像 Xygeni 這樣的安全工具會自動強制執行序列化規範。 讓開發人員能夠專注於程式碼編寫,而不是審計。
結論——關於 System.Text.Json
System.Text.Json 雖然序列化速度很快,但這種便利性往往會帶來安全隱憂。預設情況下,system.text.json 序列化會包含所有公共屬性,這可能會導致內部資料、令牌或識別碼外洩。
開發者應該:
- 審核他們的模型。
- 使用 [JsonIgnore] 而且安全 JsonSerializerOptions.
- 避免序列化內部物件。
- 使用諸如此類的工具自動掃描 Xygeni Code Security.
預設序列化並非開發者的捷徑,它還可能導致資料外洩。務必明確指定序列化方式,驗證輸出,並自動執行檢查,因為看似安全的預設設定並不總是安全的。






