2014-09-02 10 views
33

Ich habe ein Formular, das verwendet wird, um ein Memo zu erstellen, um dies zu tun habe ich einen Rich-Text-Editor, um einige Styling bieten, erstellt HTML-Tags, um Stil anzuwenden. Wenn ich diesen Text poste, gibt der mvc einen Fehler aus, um potentiell gefährliche Skripte zu verhindern, also muss ich es ausdrücklich erlauben.ValidateInput (false) vs AllowHtml

Ich habe 2 Möglichkeiten gefunden, das zu tun, dekorieren die Controller-Methode mit [ValidateInput(false)] oder verzieren das ViewModel Attribut mit [AllowHtml]

mir sieht [AllowHtml] viel schöner, aber ich habe festgestellt, nur dass Ansatz 1 Mal und die [ValidateInput(false)] scheint der bevorzugte Weg zu sein.

so werde ich gerne wissen, was Sie denken, welche sollte ich verwenden? Was sind die Unterschiede zwischen den 2?

tks

Antwort

83

ValidateInput und AllowHTML sind direkt verbunden mit XSS Sicherheitsfragen.

Lassen Sie uns zuerst versuchen, XSS zu verstehen.

XSS (Cross-Site Scripting) ist ein Sicherheitsangriff, bei dem der Angreifer bei der Dateneingabe schädlichen Code einschleust. Die gute Nachricht ist nun, dass XSS in MVC standardmäßig verhindert ist. Wenn also jemand versucht, JavaScript oder HTML-Code zu posten, landet er mit folgendem Fehler.

Enter image description here

Aber in Echtzeit gibt es Szenarien, in denen HTML erlaubt werden muss, wie HTML-Editoren. Für diese Art von Szenarien können Sie Ihre Aktion mit dem folgenden Attribut dekorieren.

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

Aber warten Sie, es gibt ein Problem hier. Das Problem ist, dass wir HTML auf die komplette Aktion erlaubt haben, was gefährlich sein kann. Wenn wir also eine präzisere Kontrolle über die Feld- oder Eigenschaftsebene haben, die wirklich eine saubere, saubere und professionelle Lösung schaffen würde.

Hier ist AllowHTML nützlich. Sie können im folgenden Code sehen, ich habe "AllowHTML" auf der Produktklasse Eigenschaftsebene eingerichtet.

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

So „ValidateInput“ zusammenfassen können Skripte und HTML auf Aktionsebene geschrieben werden, während „AllowHTML“ auf einer detaillierteren Ebene ist.

Ich würde empfehlen, "AllowHTML" mehr zu verwenden, bis Sie sehr sicher sind, dass die ganze Aktion nackt sein muss.

Ich würde Ihnen empfehlen, den Blogpost Preventing XSS Attacks in ASP.NET MVC using ValidateInput and AllowHTML zu lesen, der Schritt für Schritt über die Wichtigkeit dieser zwei Attribute mit einem Beispiel demonstriert.

+1

gut, Sie hier zu sehen, Sir. Viele deiner Posts waren für mich beim Codeprojekt nützlich. –

+1

Wenn in Ihrem Beispiel html in das Feld 'ProductName' eingegeben würde, würde der Fehler trotzdem angezeigt (wie erwartet). Gibt es eine Möglichkeit, eine benutzerfreundlichere Fehlermeldung zu präsentieren? Dieser Fehler scheint Benutzerdefinierte Fehlerkonfiguration zu ignorieren. – philreed

Verwandte Themen