Примечание: Этот ответ никоим образом не следует рассматривать как полный, безопасность всегда трудна, а если она важна для вас - всегда консультируйтесь со сторонней компанией по тестированию безопасности и проникновению.Это всего лишь несколько вещей, которые вы должны рассмотреть, чтобы сделать ваше приложение MVC более безопасным (не обязательно безопасным).
Защита контроллеров
Первый шаг - применить [Authorize]
к вашим контроллерам, чтобы убедиться, чтоперед доступом к методу существует какая-то действительная аутентификация.Желательно добавить Authorize
ко всем контроллерам и сделать исключения с [AllowAnonymous]
, чтобы сделать его безопасным по умолчанию.
Авторизовать пользователя
Даже если вы добавили [Authorize]
кконтроллер, это только означает, что пользователь вошел в систему, а не то, что пользователь должен иметь доступ к тому методу, к которому осуществляется доступ.Первым шагом является расширение атрибута путем указания набора ролей для метода: [Authorize(Roles = "Administrator"]
В зависимости от приложения вам также может потребоваться проверить, принадлежит ли текущий пользователь компании / группе или какому-либо другомуредактируется, чтобы предотвратить изменение данных, которые ему не принадлежат.
Не допускайте утечки данных в модели
Если вы используете свои фактические модели данных в качестве моделей представления, вы рискуете позволить пользователю ввести больше данных, чем он должен.Рассмотрим следующий пример:
class Employee {
public int Id { get; set; }
public string Name { get; set; }
public int Salary { get; set; }
}
Предположим, что мы по какой-то причине разрешаем нашим сотрудникам менять свое имя, и для этого мы используем модель Employee
.Но, конечно, мы делаем только поле редактирования для Name
, а не Salary
, как это было бы глупо: D.Однако из-за того, как работает привязка модели, умный Сотрудник может просто добавить <input type="text" name="Salary" value="2147483647">
к форме при изменении их имени, и наш доверчивый db.Entry(employee).State = EntityState.Added;
, за которым следует db.SaveChanges()
, также обновит свою зарплату.
Решение?Либо создайте модель представления только со свойством Id
и Name
, чтобы сделать невозможным изменение зарплаты, либо используйте атрибут Bind
, чтобы включить только те свойства, которые мы разрешаем: public IActionResult Update([Bind(Include="Id,Name")]Employee model)
.
XSS
Очень важной частью является защита ваших пользователей от плохого динамического контента.Если я могу ввести HTML и Javascript, который отображается для другого пользователя, я могу злоупотребить этим, например, чтобы украсть их маркер аутентификации.Создание никогда не отображать введенные пользователем данные в виде HTML является первым шагом, чтобы предотвратить это.Вы также должны всегда использовать маркер против подделки в своих формах.Добавление заголовков CSP - это хорошая практика, которая запрещает кому-либо вводить сценарии, которых там быть не должно.