ValidateInput (false) vs AllowHtml

У меня есть форма, которая используется для создания заметки, для этого я использую текстовый редактор, чтобы обеспечить некоторые стили, это создает HTML-теги для применения стиля. Когда я публикую этот текст, mvc выдает ошибку, чтобы предотвратить потенциально опасные сценарии, поэтому я должен специально разрешить это.

Я нашел 2 способа сделать это: один - украсить метод контроллера с помощью [ValidateInput(false)], а другой - украсить атрибут ViewModel с помощью [AllowHtml]. Для меня [AllowHtml] выглядит намного лучше, но я обнаружил, что этот подход использовался 1 раз, а [ValidateInput(false)] кажется предпочтительным.

Какой метод я должен использовать и каковы различия между ними?

Ответ 1

ValidateInput и AllowHTML напрямую связаны с проблемами безопасности XSS.

Итак, сначала попробуем понять XSS.

XSS (межсайтовый скриптинг) - это атака безопасности, когда злоумышленник вводит вредоносный код во время ввода данных. Теперь хорошей новостью является то, что XSS по умолчанию помечен в MVC. Поэтому, если кто-то пытается опубликовать JavaScript или HTML-код, он приземляется с ошибкой ниже.

Enter image description here

Но в реальном времени есть сценарии, где HTML должен быть разрешен, например, редакторов HTML. Таким образом, для этих сценариев вы можете украсить свое действие атрибутом ниже.

[ValidateInput(false)]
public ActionResult PostProduct(Product obj)
{
    return View(obj);
}

Но подождите, здесь есть проблема. Проблема в том, что мы допустили HTML на полное действие, которое может быть опасным. Поэтому, если мы можем иметь более подробный контроль над полем или уровнем собственности, который действительно создал бы аккуратное, аккуратное и профессиональное решение.

Thats where AllowHTML полезен. Вы можете видеть в приведенном ниже коде, который я украсил "AllowHTML" на уровне свойства класса продукта.

public class Product
{
    public string ProductName { get; set; }
    [AllowHtml]
    public string ProductDescription { get; set; }
}

Итак, суммирование "ValidateInput" позволяет размещать сценарии и HTML на уровне действия, а "AllowHTML" - на более узком уровне.

Я бы рекомендовал использовать "AllowHTML" больше, пока вы не будете уверены, что все действие должно быть обнаженным.

Я бы порекомендовал вам прочитать сообщение в блоге Предотвращение XSS-атак в ASP.NET MVC с использованием ValidateInput и AllowHTML, который шаг за шагом демонстрирует важность этих двух атрибутов с примером.

Ответ 2

если использовать Bind Включить, лучше всего использовать AllowHtml в противном случае Вы можете использовать ValidateInput (false), чтобы отключить все Validaton в контроле