System.Text.Json работает из коробки, но умолчания выбирались для удобства, а не безопасности. Разбираем пять настроек, которые стоит менять перед релизом.• Дублирующиеся ключи
{"role":"user","role":"admin"}По умолчанию десериализатор молча возьмёт
admin. Именно это эксплуатировал CVE-2022-25757: шлюз видел одно значение, бэкенд — другое. Фикс: AllowDuplicateProperties = false.• Неизвестные поля
Поля, которых нет в модели, тихо выбрасываются. Переименовали свойство в DTO и забыли обновить клиент — данные исчезают без ошибки. Фикс:
UnmappedMemberHandling = JsonUnmappedMemberHandling.Disallow.•
required компилятора ≠ required для десериализатораC# 11 следит, чтобы объект нельзя было создать без обязательных полей. Десериализатор работает через рефлексию и обходит этот контроль — запишет
null туда, где поля нет в JSON. Баг всплывёт на три слоя глубже в виде NullReferenceException. Фикс: RespectRequiredConstructorParameters = true.• Регистр не важен — по умолчанию
ASP.NET Core включает
PropertyNameCaseInsensitive = true в веб-дефолтах. IsAdmin, isadmin и ISADMIN — одно и то же. Если рядом есть middleware с проверкой строк по сырому JSON — они уже видят разные вещи. Фикс: PropertyNameCaseInsensitive = false.• Nullable-аннотации игнорируются
string Name говорит, что поле не может быть null. Десериализатор это не соблюдает — запишет null без предупреждений. Фикс: RespectNullableAnnotations = true.В .NET 10 всё это одна строка:
var options = JsonSerializerOptions.Strict;
Для ASP.NET Core пайплайна
JsonOptions.SerializerOptions не заменяется целиком, флаги выставляются вручную:builder.Services.Configure<JsonOptions>(o =>
{
var s = o.SerializerOptions;
s.AllowDuplicateProperties = false;
s.UnmappedMemberHandling = JsonUnmappedMemberHandling.Disallow;
s.PropertyNameCaseInsensitive = false;
s.RespectNullableAnnotations = true;
s.RespectRequiredConstructorParameters = true;
});
Для прямых вызовов
JsonSerializer.Deserialize вне MVC-пайплайна — передавайте JsonSerializerOptions.Strict напрямую.📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#il_люминатор