2014-09-02 6 views
33

У меня есть форма, которая используется для создания заметки, для этого у меня есть текстовый редактор, чтобы обеспечить некоторый стиль, это создает теги html, чтобы применить стиль. когда я отправляю этот текст, mvc выдает ошибку, чтобы предотвратить потенциально опасные сценарии, поэтому я должен специально разрешить это.ValidateInput (false) vs AllowHtml

Я нашел 2 способ сделать это, украшающий метод контроллера с [ValidateInput(false)] или украшающим атрибутом ViewModel с [AllowHtml]

мне, [AllowHtml] выглядит намного лучше, но я только нашел, что подход, используемые 1 разы и тому [ValidateInput(false)] Швы предпочтительным способом.

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

ТКС

ответ

83

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 на полное действие, которое может быть опасным. Поэтому, если мы можем иметь более подробный контроль над полем или уровнем собственности, который действительно создал бы аккуратное, аккуратное и профессиональное решение.

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

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

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

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

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

+1

рад вас видеть здесь сэр. Много ваших сообщений было полезно для меня в проекте кода. –

+1

В вашем примере, если пользователь должен был ввести html в поле «ProductName», ошибка все равно будет отображаться (как и ожидалось). Есть ли способ представить более удобное сообщение об ошибке. Кажется, что эта ошибка игнорирует конфигурацию пользовательской ошибки. – philreed