web-dev-qa-db-fra.com

Pourquoi le message d'erreur "Une valeur Request.Form potentiellement dangereuse a été détectée par le client" s'affiche-t-il?

J'ai créé un nouveau site ASP.NET MVC 3/.NET Framework 4.0 à l'aide du modèle "Application Internet". J'ai utilisé Nuget pour installer le package Windows Azure Web Role (MVC3) , puis j'ai suivi Procédure pas à pas du service de contrôle d'accès pour configurer Windows Live ID et l'authentification Google.

Bientôt, je suis tombé sur l'erreur "Une valeur Request.Form potentiellement dangereuse a été détectée par le client" et j'ai suivi article dans le wiki Windows Identity Foundation pour essayer de le résoudre. Malheureusement, rien de ce que j'ai essayé fonctionne, y compris:

  • Réglage <httpRuntime requestValidationMode="2.0"/> et <pages validateRequest="false"> dans la racine web.config et dans Views\web.config

  • Copie SampleRequestValidator du SDK WIF dans le projet et définition de <httpRuntime requestValidationType="SampleRequestValidator"/> dans les deux web.configs

J'ai également essayé des variantes de ces derniers sans succès.

Des idées?

Voici l'exception complète:


Détails de l'exception: System.Web.HttpRequestValidationException: une valeur Request.Form potentiellement dangereuse a été détectée par le client (wresult = "<t:RequestSecurityTo... ").

Description: La validation de la demande a détecté une valeur d'entrée client potentiellement dangereuse et le traitement de la demande a été abandonné. Cette valeur peut indiquer une tentative de compromettre la sécurité de votre application, telle qu'une attaque de script intersite. Pour permettre aux pages de remplacer les paramètres de validation de la demande d'application, définissez l'attribut requestValidationMode dans la section de configuration httpRuntime sur requestValidationMode = "2.0". Exemple: <httpRuntime requestValidationMode="2.0" />. Après avoir défini cette valeur, vous pouvez ensuite désactiver la validation de la demande en définissant validateRequest = "false" dans la directive Page ou dans le <pages> section de configuration. Cependant, il est fortement recommandé que votre application vérifie explicitement toutes les entrées dans ce cas. Pour plus d'informations, voir http://go.Microsoft.com/fwlink/?LinkId=1531 .

Trace de pile:

[HttpRequestValidationException (0x80004005): une valeur Request.Form potentiellement dangereuse a été détectée par le client (wresult = "<t:RequestSecurityTo... ").]

 System.Web.HttpRequest.ValidateString (valeur de chaîne, String collectionKey, RequestValidationSource requestCollection) +8755668 
 System.Web.HttpRequest.ValidateNameValueCollection (NameValueCollection nvc, RequestValidationSource12. System.Web.HttpRequest.get_Form () +114 
 Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.IsSignInResponse (HttpRequest request) +75 
 Microsoft.IdentityModel.Web.WSFederationAuthenticationResponse ( onPage) +205 
 Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.CanReadSignInResponse (demande HTTP). .] System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () +148 
 System.Web.HttpApplication.ExecuteStep (étape IExecutionStep, booléen et terminé de manière synchrone) +75 [.___ _.]

21
Alex Angas

Vous pouvez essayer de décorer l'action du contrôleur dans laquelle vous publiez (et celle qui lève cette exception) avec l'attribut [ValidateInput(false)] (en laissant <httpRuntime requestValidationMode="2.0"/> dans web.config).

18
Darin Dimitrov

J'ai eu le même problème.

Voici un exemple de ma solution:

 [ValidateInput(false)]

    public ActionResult *YourMethodName*(FormCollection forms)
    {
          // Encoded String
          string EncodedValue = Server.HtmlEncode(forms[*name or index*]);

         // Normal String 
         string value = forms[*name or index*]

         //.... 
    }

Vous n'avez besoin de rien dans votre configuration Web.

16
Marco Ramos

J'ai écrit une petite note de blog à ce sujet ici: http://erikbra.wordpress.com/2012/04/17/wif-saml-token-post-and-requestvalidationmode2-0/ . Il n'est pas nécessaire de désactiver la validation des demandes ou de la définir sur 2.0 pour l'ensemble de votre site.

En bref, il vous suffit de modifier le mode requestValidationMode en 2.0 sur l'URL spécifique à laquelle WIF publie le jeton SAML. Cela peut être fait avec un élément (voir Élément location (Schéma des paramètres ASP.NET) pour plus de détails) dans votre web.config, comme ceci:

<location path="WIFHandler">
  <system.web>
    <httpRuntime requestValidationMode="2.0" />
  </system.web>
</location>

L'emplacement "WIFHandler" n'a pas besoin d'exister dans votre application, car WIF raccourcira le pipeline avant qu'ASP.NET essaie de gérer la demande et vous redirigera vers l'URL de retour (ru dans le wctx paramètre du jeton SAML POST) à la place.

Dans votre section de configuration WIF du fichier web.config, veillez à faire correspondre le paramètre "reply" avec l'emplacement où vous définissez le mode de validation de la demande sur le mode 2.0:

<Microsoft.identityModel>
    <service>
      <federatedAuthentication>
        <wsFederation passiveRedirectEnabled="true" 
                      issuer="https://localhost/STS/" 
                      realm="https://localhost/MyApp/"
                      reply="https://localhost/MyApp/WIFHandler/" />

(...)
13

D'abord, précisez d'où cela vient. Utilisez fiddler pour rechercher le champ à l'origine du problème. Les éléments aussi simples que: <s provoqueront cette erreur lorsqu'ils seront publiés sans être codés. Vous pouvez également décorer votre modèle avec l'attribut [AllowHtml] et essayer de ne pas activer l'encodage 2.0 - c'est un peu dangereux.

2

Je ne vois aucune réponse ici mentionner cela. alors ça y va.

En plus de "[ValidateInput (false)]", dans votre aspx, vous devrez peut-être l'ajouter à votre <% @ Page ...>

<%@ Page ValidateRequest="false">

Cela permettrait de désactiver la validation des demandes par page au lieu de l'ensemble de l'application Web.

2
Jach

Copie de SampleRequestValidator du SDK WIF dans le projet et configuration dans les deux web.configs

Cela devrait le réparer. Pouvez-vous vérifier que le code s'exécute réellement? Si vous placez un point d'arrêt dans le validateur de demande, est-il atteint?

Je suppose que vous mettez <httpRuntime...> sous <system.web> droite?

2
Eugenio Pace

J'ai rencontré ce problème en parcourant le didacticiel "Authentification unique d'Active Directory vers une application Windows Azure". Dans mon cas, le problème était que j'avais placé par inadvertance le <httpRuntime ... /> valeur incorrecte <system.web /> section dans mon fichier web.config (je ne l'avais pas remarqué à l'origine, mais il y a un nouveau <location> section avec un chemin d'accès "FederationMetadata" qui contient également system.web.). La valeur doit être placée dans le niveau supérieur <system.web> section.

1
NateTheGreat

À première vue, il ressemble à un bogue dans la bibliothèque Azure Mvc3. MVC 3 expose des API spéciales qui vous permettent de récupérer des valeurs non validées de la collection Form, mais le module ne semble pas les utiliser.

0
marcind