Question Une valeur Request.Form potentiellement dangereuse a été détectée sur le client


Chaque fois qu'un utilisateur publie quelque chose contenant < ou > dans une page de mon application Web, cette exception est levée.

Je ne veux pas entrer dans la discussion sur l'ingéniosité de lancer une exception ou de planter une application web entière parce que quelqu'un a saisi un caractère dans une zone de texte, mais je cherche une façon élégante de gérer cela.

Trapping de l'exception et affichage

Une erreur est survenue, veuillez revenir en arrière et retaper votre formulaire entier, mais cette fois-ci, n'utilisez pas <

ne me semble pas assez professionnel.

Désactivation de la validation après validation (validateRequest="false") va certainement éviter cette erreur, mais cela rendra la page vulnérable à un certain nombre d'attaques.

Idéalement: lorsqu'un post-retour se produit contenant des caractères HTML restreints, cette valeur affichée dans la collection Form sera automatiquement codée en HTML. Alors le .Text la propriété de ma zone de texte sera something & lt; html & gt;

Y a-t-il une manière que je peux faire ceci d'un gestionnaire?


1324
2017-09-17 10:58


origine


Réponses:


Je pense que vous l'attaquez du mauvais angle en essayant d'encoder toutes les données postées.

Notez qu'un "<"pourrait également provenir d'autres sources extérieures, comme un champ de base de données, une configuration, un fichier, un flux et ainsi de suite.

En outre, "<"n'est pas intrinsèquement dangereux, c'est seulement dangereux dans un contexte spécifique: lors de l'écriture de chaînes qui n'ont pas été encodées en sortie HTML (à cause de XSS).

Dans d'autres contextes, des sous-chaînes différentes sont dangereuses, par exemple, si vous écrivez une URL fournie par l'utilisateur dans un lien, la sous-chaîne "javascript:Le caractère guillemet simple est dangereux lors de l'interpolation de chaînes dans des requêtes SQL, mais parfaitement sûr s'il fait partie d'un nom soumis à partir d'un formulaire ou lu à partir d'un champ de base de données.

La ligne du bas est: vous ne pouvez pas filtrer les entrées aléatoires pour les caractères dangereux, car n'importe quel personnage peut être dangereux dans les bonnes circonstances. Vous devriez encoder au point où certains caractères spécifiques peuvent devenir dangereux parce qu'ils traversent dans une sous-langue différente où ils ont une signification particulière. Lorsque vous écrivez une chaîne au format HTML, vous devez encoder les caractères qui ont une signification particulière en HTML, en utilisant Server.HtmlEncode. Si vous passez une chaîne à une instruction SQL dynamique, vous devez encoder des caractères différents (ou mieux, laissez le framework le faire pour vous en utilisant des instructions préparées ou similaires).

Quand vous êtes sûr que vous codez HTML partout où vous passez des chaînes au format HTML, puis définissez validateRequest="false" dans le <%@ Page ... %> directive dans votre .aspx des dossiers).

Dans .NET 4, vous devrez peut-être en faire un peu plus. Parfois, il est également nécessaire d'ajouter <httpRuntime requestValidationMode="2.0" /> à web.config (référence).


995
2017-09-17 11:26



Il existe une solution différente à cette erreur si vous utilisez ASP.NET MVC:

Échantillon C #:

[HttpPost, ValidateInput(false)]
public ActionResult Edit(FormCollection collection)
{
    // ...
}

Échantillon Visual Basic:

<AcceptVerbs(HttpVerbs.Post), ValidateInput(False)> _
Function Edit(ByVal collection As FormCollection) As ActionResult
    ...
End Function

467
2017-10-08 22:56



Dans ASP.NET MVC (à partir de la version 3), vous pouvez ajouter AllowHtml attribuer à une propriété sur votre modèle.

Il permet à une requête d'inclure un balisage HTML pendant la liaison d'un modèle en ignorant la validation de la demande pour la propriété.

[AllowHtml]
public string Description { get; set; }

361
2017-09-05 09:33



Si vous êtes sur .NET 4.0, assurez-vous de l'ajouter dans votre web.config déposer à l'intérieur du <system.web> Mots clés:

<httpRuntime requestValidationMode="2.0" />

Dans .NET 2.0, la validation de la requête n'est appliquée qu'à aspx demandes Dans .NET 4.0, ceci a été étendu pour inclure tout demandes Vous pouvez revenir à seulement effectuer la validation XSS lors du traitement .aspx en spécifiant:

requestValidationMode="2.0"

Vous pouvez désactiver la validation de la requête entièrement en spécifiant:

validateRequest="false"

202
2017-07-30 04:51



Pour ASP.NET 4.0, vous pouvez autoriser le balisage en tant qu'entrée pour des pages spécifiques au lieu du site entier en les mettant toutes dans un <location> élément. Cela permettra de s'assurer que toutes vos autres pages sont en sécurité. Vous n'avez pas besoin de mettre ValidateRequest="false" dans votre page .aspx.

<configuration>
...
  <location path="MyFolder/.aspx">
    <system.web>
      <pages validateRequest="false" />
      <httpRuntime requestValidationMode="2.0" />
    </system.web>
  </location>
...
</configuration>

Il est plus sûr de contrôler cela dans votre web.config, car vous pouvez voir au niveau du site quelles pages permettent le balisage en entrée.

Vous devez toujours valider par programmation les entrées sur les pages où la validation de la requête est désactivée.


102
2017-11-27 17:22



Les réponses précédentes sont excellentes, mais personne n'a dit comment exclure un seul champ d'être validé pour des injections HTML / JavaScript. Je ne connais pas les versions précédentes, mais dans MVC3 Beta, vous pouvez faire ceci:

[HttpPost, ValidateInput(true, Exclude = "YourFieldName")]
public virtual ActionResult Edit(int id, FormCollection collection)
{
    ...
}

Cela valide toujours tous les champs sauf celui exclu. La bonne chose à ce sujet est que vos attributs de validation valident encore le champ, mais vous n'obtenez pas l'exception «Une valeur Request.Form potentiellement dangereuse a été détectée par le client».

J'ai utilisé ceci pour valider une expression régulière. J'ai fait mon propre ValidationAttribute pour voir si l'expression régulière est valide ou non. Comme les expressions régulières peuvent contenir quelque chose qui ressemble à un script, j'ai appliqué le code ci-dessus - l'expression régulière est toujours vérifiée si elle est valide ou non, mais pas si elle contient des scripts ou HTML.


68
2017-11-06 14:58



Dans ASP.NET MVC, vous devez définir requestValidationMode = "2.0" et validateRequest = "false" dans web.config, et appliquer un attribut ValidateInput à votre action de contrôleur:

<httpRuntime requestValidationMode="2.0"/>

<configuration>
    <system.web>
        <pages validateRequest="false" />
    </system.web>
</configuration>

et

[Post, ValidateInput(false)]
public ActionResult Edit(string message) {
    ...
}

46
2017-11-30 12:56



Vous pouvez Encodage HTML contenu de la zone de texte, mais malheureusement, cela n'empêchera pas l'exception de se produire. Dans mon expérience, il n'y a pas moyen de contourner, et vous devez désactiver la validation de la page. En faisant cela, vous dites: "Je ferai attention, je le promets."


45
2017-09-17 11:20



Pour MVC, ignorez la validation des entrées en ajoutant

[ValidateInput (false)]

au-dessus de chaque action dans le contrôleur.


42
2018-01-29 09:40