ASP.NET MVC 5. Безопасность Веб-Приложений
4. Оверпостинг
Привязка модели ASP.NET MVC - это мощная функция, которая значительно упрощает процесс обработки пользовательского ввода, автоматически сопоставляя входные данные со свойствами модели на основе соглашений об именовании. Однако она открывает ещё один вектор атаки, позволяющий злоумышленнику заполнить свойства модели, которые вы не указывали в форме ввода. Допустим, мы создаём систему отзывов о товарах магазина:
public class Review {
public int ReviewID { get; set; } // Первичный ключ
public int ProductID { get; set; } // Внешний ключ
public Product Product { get; set; } // Внешняя сущность
public string Name { get; set; }
public string Comment { get; set; }
public bool Approved { get; set; }
}
У нас есть простая форма с двумя полями, доступными для пользователя Name и Comment:Name: @Html.TextBox("Name") <br />
Comment: @Html.TextBox("Comment")
Несмотря на то, что в форме открыты только имя и комментарий, злонамеренный пользователь может легко вмешаться в отправляемые данные формы, используя инструменты веб-разработчика, добавив «Approved=true» в строку запроса или POST-данные формы. Связыватель модели не знает, какие поля вы включили в форму, и установит для свойства Approved значение true.Атака оверпостингом использует общую для MVC веб-сред функцию. В марте 2012 года такой атаке подвергся GitHub.com. Атакующий создал новый открытый ключ администратора и вручную добавил его в скрытое поле формы. После отправки формы он получал административные привилегии.
Предотвращение оверпостинга
1. Самый простой способ предотвратить атаку оверпостингом - использовать атрибут BindAttribute, чтобы явно контролировать, какие свойства должны получать значения через связыватель модели. Можно использовать либо белый список:
[Bind(Include="Name, Comment")]либо чёрный
[Bind(Exclude="ReviewID, ProductID, Product, Approved"]При этом можно разместить
BindAttribute либо в классе модели, либо в списке параметров метода действия контроллера.2. Можно использовать одну из перегрузок UpdateModel или TryUpdateModel, которая принимает список полей для привязки:
UpdateModel(review, "Review", new string[] { "Name", "Comment" });
3. Возможно, лучший способ справиться с оверпостингом - это избегать привязки непосредственно к модели данных. Это можно сделать, используя модель представления, содержащую только те свойства, которые пользователю разрешено устанавливать:public class ReviewViewModel {
public string Name { get; set; }
public string Comment { get; set; }
}
Привязка к модели представления намного надёжнее привязки к модели данных. Вместо того, чтобы помнить о включении новых полей в белый или черный списки, в подходе с моделью представления единственный способ использовать привязку к свойству - это включить его в модель представления.Источник: Jon Galloway “Professional ASP.NET MVC 5”. – John Wiley & Sons Inc., 2014. Глава 7.