system.text.json - jsonserializer - 系統文字 json 序列化

.NET 中的 System.Text.Json 預設值:便利性帶來的資料外洩

預設系統文字 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 序列化意味著掌控哪些內容會離開你的應用程式。

實用防禦

  1. 明確約定: 為 API 回應建立專用 DTO,切勿直接序列化 EF 或領域實體。
  2. 配置全域選項: 使用 JsonSerializerOptions.DefaultIgnoreCondition 以及 物業命名政策.
  3. 在斷裂前, [JsonIgnore] 或轉換器: 隱藏或轉換敏感資料。
  4. 驗證輸出結果: 檢查測試中實際的序列化響應。
  5. 自動檢查: 在序列化驗證中加入 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.

預設序列化並非開發者的捷徑,它還可能導致資料外洩。務必明確指定序列化方式,驗證輸出,並自動執行檢查,因為看似安全的預設設定並不總是安全的。

sca-tools-software-composition-analysis-tools
優先處理、補救並保護您的軟體風險
註冊免費帳號。
不需要信用卡。

確保您的軟體開發和交付安全

使用 Xygeni 產品套件