Скрытые риски при сериализации 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 расширяет зону покрытия без предупреждения
JsonSerializer в System.Text.Json не останавливается на поверхностном уровне. Он рекурсивно обходит вложенные объекты, коллекции и значения перечислений, сериализуя всё, к чему может получить доступ. Без явного исключения это может легко привести к вложенным утечкам данных, особенно когда внутренние объекты содержат токены, идентификаторы или ключи сеанса.
⚠️Небезопасный пример, только для образовательных целей. Не использовать в продакшене.
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, включая конфиденциальную информацию. AccessToken автоматически.
Защищенная версия:
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 по умолчанию усиливает их уязвимость. Распространенные закономерности, при которых небезопасная сериализация приводит к утечке данных:
- Повторное использование сущностей EF Core непосредственно в ответах API.
Регистрация сериализованных объектов, содержащих данные аутентификации. - Обмен моделями между внутренними и государственными службами в 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 позволяет контролировать содержимое, которое выводится из приложения.
Практические защиты
- Определите явные контракты: Создавайте специальные DTO для ответов API, никогда не сериализуйте EF или доменные сущности напрямую.
- Настройте глобальные параметры: Используйте JsonSerializerOptions.DefaultIgnoreCondition и PropertyNamingPolicy.
- Применить [JsonIgnore] или преобразователи: Скройте или преобразуйте конфиденциальные данные.
- Проверка выходных данных: Проверьте фактические сериализованные ответы в тестах.
- Автоматизировать проверки: Включить проверку сериализации в CI/CD.
Мини-профилактический контрольный список
- Просмотрите все классы, использующие сериализацию System.Text.Json.
- Отметьте секреты или учетные данные с помощью [JsonIgnore]
- Определить глобальные безопасные значения по умолчанию в Программа.cs or Стартап.cs
- Избегайте прямой сериализации в журналах
- Включите тесты воздействия сериализации в ваши 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
Ксигени Code Security обеспечивает глубокое обнаружение небезопасных значений System.Text.Json по умолчанию и неправильного использования JsonSerializer в NET.
Он выявляет такие закономерности, как:
- Конфиденциальные поля сериализуются по умолчанию.
- Небезопасное логирование данных JSON.
- Отсутствующий [JsonIgnore] атрибутов.
- Неправильно настроены параметры сериализации JSON системного текста.
Путем интеграции Ксигени в pre-commit hooks, CI/CD pipelines или PR-шлюзы позволяют блокировать уязвимые шаблоны сериализации до их слияния. Он дополняет существующий процесс DevSecOps, превращая неправильные конфигурации сериализации в реализуемые политики безопасности.
Примечание: инструменты безопасности, такие как Xygeni, автоматически обеспечивают соблюдение гигиены сериализации. позволяя разработчикам сосредоточиться на коде, а не на аудитах.
Заключение – О System.Text.Json
System.Text.Json Сериализация ускоряет процесс, но удобство часто скрывает уязвимость. Сериализация system.text.json по умолчанию включает все публичные свойства, что может привести к утечке внутренних данных, токенов или идентификаторов.
Разработчикам следует:
- Проведите аудит своих моделей.
- Используйте [JsonIgnore] и безопасно JsonSerializerOptions.
- Избегайте сериализации внутренних объектов.
- Автоматизируйте сканирование с помощью таких инструментов, как Xygeni Code Security.
Сериализация по умолчанию — это не просто способ сэкономить время разработчика, это потенциальная утечка данных. Сделайте сериализацию явной, проверяйте выходные данные и автоматизируйте проверки, поскольку безопасные значения по умолчанию не всегда безопасны.






