web-dev-qa-db-fra.com

ValidateInput (false) vs AllowHtml

J'ai un formulaire qui est utilisé pour créer un mémo. Pour ce faire, j'utilise un éditeur de texte enrichi pour donner du style, cela crée des balises html afin d'appliquer un style. Lorsque je poste ce texte, le MVC émet une erreur pour empêcher les scripts potentiellement dangereux, je dois donc l'autoriser spécifiquement.

J'ai trouvé deux façons de procéder: l'une consiste à décorer la méthode du contrôleur avec [ValidateInput(false)] et l'autre à décorer l'attribut ViewModel avec [AllowHtml]. Pour moi, [AllowHtml] A l'air beaucoup plus joli, mais je n'ai trouvé que cette approche utilisée 1 fois et la [ValidateInput(false)] semble être la méthode préférée.

Quelle méthode dois-je utiliser et quelles sont les différences entre les deux?

46
EricGS

ValidateInput et AllowHTML sont directement connectés avec XSS problèmes de sécurité .

Essayons d’abord de comprendre XSS.

XSS (cross-site scripting) est une attaque de sécurité dans laquelle l'attaquant injecte un code malveillant tout en saisissant des données. Maintenant, la bonne nouvelle est que XSS est empêché par défaut dans MVC. Donc, si quelqu'un essaie de publier du code JavaScript ou HTML, il tombe avec l'erreur ci-dessous.

Enter image description here

Mais en temps réel, il existe des scénarios dans lesquels le langage HTML doit être autorisé, comme les éditeurs HTML. Donc, pour ce genre de scénario, vous pouvez décorer votre action avec l'attribut ci-dessous.

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

Mais attendez, il y a un problème ici. Le problème est que nous avons autorisé HTML à effectuer l'action complète, ce qui peut être dangereux. Donc, si nous pouvions avoir un contrôle plus granulaire au niveau du terrain ou de la propriété, cela créerait vraiment une solution ordonnée, ordonnée et professionnelle.

C’est là que AllowHTML est utile. Vous pouvez voir dans le code ci-dessous que j'ai décoré "AllowHTML" au niveau de la propriété de la classe de produit.

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

Ainsi, résumer "ValidateInput" permet aux scripts et au HTML d'être publiés au niveau action alors que "AllowHTML" est à un niveau plus granulaire.

Je recommanderais d'utiliser "AllowHTML" davantage jusqu'à ce que vous soyez vraiment sûr que toute l'action doit être nue.

Je vous recommanderais de lire le billet de blog Prévenir les attaques XSS dans ASP.NET MVC à l'aide de ValidateInput et AllowHTML, qui montre étape par étape l'importance de ces deux attributs avec un exemple.

112

si utiliser Bind Include est le meilleur moyen, AllowHtml, sinon vous pouvez utiliser ValidateInput (false) pour désactiver tous les Validaton dans le contrôleur

0
pejman mirzaee