system.text.json - jsonserializer - chuyển đổi văn bản hệ thống thành JSON

Các thiết lập mặc định của System.Text.Json trong .NET: Khi sự tiện lợi mở ra nguy cơ rò rỉ dữ liệu

Rủi ro tiềm ẩn trong quá trình tuần tự hóa JSON văn bản hệ thống mặc định

Thư viện System.Text.Json đã trở thành mặc định cho hầu hết các ứng dụng .NET hiện đại. Nó hiệu quả, nhẹ và được tích hợp sâu vào ASP.NET Core. Nhưng chính những đặc điểm mặc định giúp nó đơn giản cũng tiềm ẩn những rủi ro bảo mật. Theo mặc định, quá trình tuần tự hóa System.Text.Json tự động tuần tự hóa tất cả các thuộc tính công khai, ngay cả những thuộc tính chứa dữ liệu nhạy cảm như mã thông báo hoặc mã định danh nội bộ. Các nhà phát triển thường dựa vào các thiết lập mặc định này để tăng tốc độ, mà bỏ qua nguy cơ làm lộ thông tin bí mật trong phản hồi API (jsonserializer). 

⚠️Ví dụ này không an toàn, chỉ mang tính chất minh họa. Không sử dụng trong môi trường sản xuất.

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..."} 

Hành vi của trình tuần tự hóa JSON này bộc lộ Mã thông báo phiên Bởi vì tất cả các thuộc tính công khai đều được tuần tự hóa tự động.

Phiên bản bảo mật:

public class UserProfile {     public string UserName { get; set; }     public string Email { get; set; }       [JsonIgnore] // Prevent serialization of sensitive fields     public string SessionToken { get; set; } } 

Lưu ý về giáo dục: Luôn luôn sử dụng [JsonIgnore] Đối với các thuộc tính nhạy cảm hoặc thiết kế, hãy tách riêng các DTO chỉ chứa các trường dành cho việc tuần tự hóa.

Cách JsonSerializer mở rộng phạm vi tiếp cận mà không có cảnh báo

JsonSerializer trong System.Text.Json không chỉ dừng lại ở cấp độ bề mặt. Nó duyệt đệ quy qua các đối tượng lồng nhau, các tập hợp và các giá trị enum, tuần tự hóa mọi thứ mà nó có thể truy cập. Nếu không có sự loại trừ rõ ràng, điều này có thể dễ dàng dẫn đến rò rỉ dữ liệu lồng nhau, đặc biệt khi các đối tượng nội bộ chứa mã thông báo, định danh hoặc khóa phiên.

⚠️Ví dụ này không an toàn, chỉ mang tính chất minh họa. Không sử dụng trong môi trường sản xuất.

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"}} 

Đối tượng lồng nhau khiến quá trình tuần tự hóa JSON văn bản hệ thống bao gồm cả thông tin nhạy cảm. Mã truy cập tự động.

Phiên bản bảo mật:

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); 

Lưu ý về giáo dục: Luôn luôn định nghĩa Tùy chọn JsonSerializer Xem xét kỹ lưỡng và kiểm tra các kiểu lồng nhau để tránh rò rỉ dữ liệu ngoài ý muốn.

Tác động thực tiễn của API và Microservices

Trong các ứng dụng .NET thực tế, những rủi ro về tuần tự hóa này thường không được phát hiện cho đến sau khi triển khai. Sự kết hợp giữa tự động hóa, việc tái sử dụng DTO và hành vi mặc định của jsonserializer làm tăng mức độ rủi ro. Các kiểu lỗi thường gặp khi tuần tự hóa không an toàn dẫn đến rò rỉ dữ liệu:

  • Tái sử dụng trực tiếp các thực thể EF Core trong phản hồi API.
    Ghi nhật ký các đối tượng được tuần tự hóa có chứa dữ liệu xác thực.
  • Chia sẻ mô hình giữa các dịch vụ nội bộ và công cộng trong CI/CD pipelines.

⚠️Ví dụ này không an toàn, chỉ mang tính chất minh họa. Không sử dụng trong môi trường sản xuất.

// Logs the full object, including sensitive fields _logger.LogInformation("Response: {data}", JsonSerializer.Serialize(result)); 

Nếu kết quả chứa Mã băm mật khẩu or Mã thông báo phiên, chúng hiện đang được lưu trữ trong CI/CD nhật ký, vi phạm nguyên tắc quyền lợi tối thiểu. Tuyệt đối không để lộ mã thông báo, thông tin đăng nhập hoặc URL nội bộ thực sự. pipelines.

Phiên bản bảo mật:

var options = new JsonSerializerOptions {     IgnoreReadOnlyProperties = true,     DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull }; // Sanitize before serialization result.SessionToken = null; _logger.LogInformation("Response: {data}", JsonSerializer.Serialize(result, options)); 

Lưu ý về giáo dục: Xóa hoặc vô hiệu hóa các trường thông tin nhạy cảm trước khi ghi nhật ký và luôn sử dụng các công cụ an toàn. Tùy chọn JsonSerializer Các thiết lập mặc định cho đầu ra kiểm toán.

Các biện pháp tuần tự hóa an toàn dành cho nhà phát triển

Các nhà phát triển nên coi các thiết lập mặc định của system.text.json như một lớp tiện ích, chứ không phải là một chính sách bảo mật. Việc tuần tự hóa JSON của system.text một cách an toàn có nghĩa là kiểm soát những gì rời khỏi ứng dụng của bạn.

Các biện pháp phòng vệ thực tế

  1. Xác định các hợp đồng rõ ràng: Hãy tạo các DTO chuyên dụng cho phản hồi API, tuyệt đối không được tuần tự hóa các thực thể EF hoặc thực thể miền trực tiếp.
  2. Cấu hình các tùy chọn toàn cục: Sử dụng JsonSerializerOptions.DefaultIgnoreConditionChính sách đặt tên tài sản.
  3. Rắc bột [JsonIgnore] hoặc bộ chuyển đổi: Che giấu hoặc biến đổi dữ liệu nhạy cảm.
  4. Kiểm tra tính hợp lệ của kết quả đầu ra: Kiểm tra các phản hồi được tuần tự hóa thực tế trong các bài kiểm tra.
  5. Tự động hóa các bước kiểm tra: Bao gồm xác thực tuần tự hóa trong CI/CD.

Danh sách kiểm tra phòng ngừa nhỏ

  • Xem lại tất cả các lớp sử dụng phương thức tuần tự hóa System.Text.Json.
  • Đánh dấu các thông tin bí mật hoặc thông tin xác thực bằng [JsonIgnore]
  • Xác định các giá trị mặc định an toàn toàn cầu trong Chương trình.cs or Startup.cs
  • Tránh việc tuần tự hóa trực tiếp trong nhật ký.
  • Bao gồm các bài kiểm tra mức độ tiếp xúc với mã số seri trong quy trình của bạn. CI/CD pipeline

Lưu ý về giáo dục: Việc tuần tự hóa an toàn nhằm mục đích hạn chế rủi ro, chứ không phải làm tăng độ phức tạp. Hãy làm cho quá trình tuần tự hóa trở nên rõ ràng và có thể kiểm thử được.

Phát hiện mã hóa tuần tự không an toàn bằng cách quét tự động – System.Text.Json

Quét tự động trong CI/CD Giúp phát hiện việc sử dụng System.Text.Json và JsonSerializer một cách nguy hiểm. Các công cụ phân tích tĩnh có thể xác định:

  • Các mô hình bị thiếu [JsonIgnore].
  • Các vùng nhạy cảm lộ ra trong DTO.
  • Các thiết lập mặc định toàn cục không an toàn (ví dụ: thiếu điều kiện bỏ qua).

Ví dụ Pipeline kiểm tra

# Never expose real tokens, credentials, or internal URLs in pipelines - name: Run serialization security checks   run: dotnet xygeni validate --rules serialization --fail-on-risk 

Lưu ý về giáo dục: Tích hợp kiểm tra tĩnh vào của bạn CI/CD Đảm bảo kiểm soát nhất quán quá trình tuần tự hóa JSON văn bản hệ thống trên tất cả các bản dựng.

 

Làm thế nào Xygeni Code Security Tăng cường bảo mật tuần tự hóa .NET

Xygeni Code Security Cung cấp khả năng phát hiện sâu các giá trị mặc định không an toàn của System.Text.Json và việc lạm dụng JsonSerializer trong .NET.

Nó xác định các mẫu như:

  • Các trường thông tin nhạy cảm được tuần tự hóa theo mặc định.
  • Việc ghi nhật ký dữ liệu JSON không an toàn.
  • Thiếu [JsonIgnore] thuộc tính.
  • Tùy chọn tuần tự hóa JSON văn bản hệ thống bị cấu hình sai.

Bằng cách tích hợp Xygeni trong pre-commit hooks, CI/CD pipelineSử dụng các cổng PR (Remote Persistence) hoặc PR gates, bạn có thể chặn các mẫu tuần tự hóa dễ bị tổn thương trước khi chúng được hợp nhất. Nó bổ sung cho quy trình DevSecOps hiện có của bạn bằng cách biến các cấu hình tuần tự hóa sai thành các chính sách bảo mật có thể thực thi.

Lưu ý về mặt giáo dục: Các công cụ bảo mật như Xygeni tự động thực thi việc đảm bảo tính toàn vẹn của dữ liệu tuần tự hóa. Giúp các nhà phát triển tập trung vào việc viết mã, chứ không phải kiểm toán.

Kết luận – Về vấn đề System.Text.Json

System.Text.Json Việc này giúp quá trình tuần tự hóa diễn ra nhanh chóng, nhưng sự tiện lợi thường che giấu những rủi ro. Quá trình tuần tự hóa mặc định của system.text.json bao gồm mọi thuộc tính công khai, có khả năng làm rò rỉ dữ liệu nội bộ, mã thông báo hoặc định danh.

Các nhà phát triển nên:

  • Kiểm tra mô hình của họ.
  • Sử dụng [JsonIgnore] và an toàn Tùy chọn JsonSerializer.
  • Tránh việc tuần tự hóa các đối tượng nội bộ.
  • Tự động hóa quá trình quét bằng các công cụ như... Xygeni Code Security.

Việc sử dụng cơ chế tuần tự hóa mặc định không chỉ là một lối tắt dành cho nhà phát triển; nó còn tiềm ẩn nguy cơ rò rỉ dữ liệu. Hãy xác định rõ cơ chế tuần tự hóa, kiểm tra đầu ra và tự động hóa các bước kiểm tra, bởi vì các giá trị mặc định an toàn không phải lúc nào cũng an toàn.

sca-tools-software-composition-analysis-tools
Ưu tiên, khắc phục và bảo mật các rủi ro phần mềm của bạn
Đăng ký tài khoản miễn phí ngay.
Không cần thẻ tín dụng.

Bảo mật quá trình phát triển và phân phối phần mềm của bạn.

với bộ sản phẩm Xygeni