Какие виды уязвимостей безопасности могут быть внедрены путем привязки данных запроса GET к свойствам модели страницы? - PullRequest
0 голосов
/ 15 мая 2018

Я читаю учебники на ASP .NET Core и Razor Pages.

У одного из них, когда дело касается атрибута BindProperty, есть замечания, которые я нахожу едва понятными:

Страницы бритвы, по умолчанию, связывают свойства только с не-GET глаголами.Привязка к свойствам может уменьшить объем кода, который вы должны написать.Привязка уменьшает код, используя то же свойство для визуализации полей формы (<input asp-for="Customer.Name" />) и принятия ввода.

По соображениям безопасности необходимо включить привязку данных запроса GET к свойствам модели страницы .Проверьте пользовательский ввод, прежде чем сопоставить его со свойствами.Включение этого поведения полезно при рассмотрении сценариев, в которых используются строка запроса или значения маршрута.

Чтобы привязать свойство к запросам GET, задайте для свойства SupportsGet атрибута [BindProperty] значение true: [BindProperty(SupportsGet = true)]

(выделено мной) Источник: Введение в Razor Pages в ASP.NET Core § Написание базовой формы

Я не понимаю.Почему необходимо принимать дополнительные меры безопасности при работе с GET-запросами?

Насколько я могу судить, GET-запросы должны быть безопаснее, не менее безопасными, чем POST-запросы, потому что GET получает только данные,в то время как POST отправляет данные на сервер.Таким образом, чаще всего запросы POST требуют дополнительных мер безопасности, а запросы GET не нужны.

И все же сейчас я читаю, что нормально делать X с POST, но осторожно, не делайте этого сПолучить безрассудно, вы должны подписаться и быть предупреждены, принять меры предосторожности!

Зачем нужны эти предупреждения?Какие уязвимости безопасности можно внедрить, привязав данные запроса GET к свойствам модели страницы?И почему эти уязвимости не применимы к запросам POST?

1 Ответ

0 голосов
/ 15 мая 2018

Binding является двухсторонней моделью, то есть она связывает данный элемент как для рендеринга («показать это значение здесь»), так и для отправки назад («сохранить это значение там»). Например, вы бы использовали привязку для заполнения поля ввода значением, которое пользователь мог бы затем обновить и POST назад. Связывание обрабатывает значение автоматически.

Если вы просто хотите отобразить значение, вам вообще не нужно использовать привязку. Просто сделайте это общедоступным свойством вашей модели и ссылайтесь на него напрямую ({Model.PropertyName}).

Существует множество причин, по которым следует избегать [BindProperty(SupportsGet = true)], но я думаю, что HTTP RFC 7231, раздел 9.4 хорошо его охватывает:

URI предназначены для совместного использования, а не для защиты, даже если они идентифицируют защищенные ресурсы. URI часто отображаются на дисплеях, добавляются в шаблоны при печати страницы и хранятся в различных незащищенных списках закладок. Поэтому неразумно включать в URI информацию, которая является конфиденциальной, идентифицируемой лично или может быть раскрыта.

Авторам сервисов следует избегать основанных на GET форм для представления конфиденциальных данных, поскольку эти данные будут помещены в целевой запрос. Многие существующие серверы, прокси и пользовательские агенты регистрируют или отображают целевой запрос в местах, где он может быть виден третьим лицам. Такие службы должны использовать вместо этого отправку формы на основе POST.

Поскольку поле заголовка Referer сообщает целевому сайту о контексте, который привел к запросу, оно может раскрыть информацию о немедленной истории просмотра пользователя и любую личную информацию, которая может быть найдена в URI ссылающегося ресурса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...