Как осуществляется валидация входных параметров в ASP.NET
Что проверяют
Знаете ли вы, как валидация встроена в конвейер ASP.NET Core: где срабатывает, что происходит с ошибками и где кончается проверка формата и начинается бизнес-правило. Следом спрашивают про FluentValidation и про то, чем валидация отличается от защиты от инъекций.
Как отвечать
- DataAnnotations:
[Required],[StringLength],[Range],[EmailAddress]на свойствах модели. Своё правило пишется наследникомValidationAttributeс переопределённымIsValid, проверки между полями черезIValidatableObject.Validate; - где срабатывает: сразу после привязки модели, результат попадает в
ModelState. В MVC с представлениями вы сами проверяетеModelState.IsValidи возвращаете форму с ошибками; [ApiController]: при невалидной модели метод контроллера даже не вызывается, фреймворк сам отвечает 400 сValidationProblemDetailsв формате Problem Details. Поменять ответ можно черезInvalidModelStateResponseFactoryвApiBehaviorOptions;- nullable-ссылки: при включённом
<Nullable>enable</Nullable>ненулевое свойство типаstringMVC считает обязательным и без[Required]; - Minimal API: в .NET 10 появилась встроенная валидация через
builder.Services.AddValidation(); - FluentValidation: правила в отдельном классе
AbstractValidator<T>, удобно для условной логики и тестов. Автоматическое подключение к конвейеру MVC авторы библиотеки для новых проектов больше не рекомендуют, валидатор вызывают явно или через фильтр; - бизнес-правила: «email уже занят» или «на счету не хватает средств» проверяются в сервисе с доступом к данным.
Последней линией защиты остаются ограничения в базе: уникальный индекс, NOT NULL.
Где спотыкаются
Говорят, что валидация защищает от SQL-инъекций и XSS. Нет: от инъекций защищают параметризованные запросы в EF Core или Dapper, от XSS кодирование вывода. Валидация лишь отсекает заведомо неверные данные.
Проверяют ModelState.IsValid в каждом методе контроллера с [ApiController], не зная, что фреймворк уже вернул 400 до входа в метод.
Полагаются на проверку в браузере. Её обходит любой запрос через curl, поэтому серверная валидация нужна всегда.