ValidateRequest = "false" ne fonctionne pas dans Asp.Net 4

156

J'ai un formulaire sur lequel j'utilise ckeditor. Ce formulaire fonctionnait bien sur Asp.Net 2.0 et 3.5, mais maintenant il ne fonctionne pas dans Asp.Net 4+. J'ai la directive ValidateRequest = "false". Aucune suggestion?

HasanG
la source
Il y a un court article sur le rendu des contrôles de validation correctement si quelqu'un s'en soucie: Validation d'erreur dans .NET 4
Ian
quelqu'un peut-il me faire savoir quels sont les inconvénients de l'utilisation de ValidationRequest = false?
fc123

Réponses:

194

Solution trouvée sur la page d'erreur. Juste besoin d'ajouter requestValidationMode = "2.0"

<system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime requestValidationMode="2.0" />
</system.web>

Informations MSDN: Propriété HttpRuntimeSection.RequestValidationMode

HasanG
la source
1
c'est génial, mais est-ce que quelqu'un connaît un moyen de définir cela par page? Aussi, comment puis-je mettre cela dans web.config afin qu'il fonctionne toujours avec .NET 2?
MK.
1
@MK: Je ne pense pas qu'il existe une directive de page pour ce paramètre. Vous ne pouvez pas le faire fonctionner sur .net 2. Je ne pense pas que ce soit nécessaire. Parce que vous pouvez simplement créer une application Web ciblant une seule version du framework. Copiez simplement cette ligne dans .net 4 web.config qui en a besoin ...
HasanG
2
Mais qu'est-ce qui a changé dans la validation de .net 4? Existe-t-il un moyen de le faire sans changer de mode de validation?
Sly
4
@Sly: Vous pouvez trouver la réponse ici: asp.net/learn/whitepapers/aspnet4/…
HasanG
Quelqu'un peut-il me faire savoir pourquoi dans l'application asp.net 4.0 en utilisant requestValidationMode = "2.0" est une bonne idée?
fc123
102

Il existe un moyen de ramener la validation à 2.0 pour une page. Ajoutez simplement le code ci-dessous à votre web.config:

<configuration>
    <location path="XX/YY">
        <system.web>
            <httpRuntime requestValidationMode="2.0" />
        </system.web>
    </location>

    ...
    the rest of your configuration
    ...

</configuration>
Ben Hoffman
la source
L'emplacement est n'importe quel chemin et est basé sur n'importe quel nœud sous le dossier que vous spécifiez dans l'arborescence.
DFTR
7
C'est une meilleure solution que la réponse acceptée car elle n'est pas à l'échelle de l'application, mais plutôt limitée à la portée spécifique que vous définissez dans le chemin de l'emplacement
Charles Wesley
5
La déclaration <location ..> ci-dessus doit être placée à l'intérieur de la déclaration <configuration> mais pas davantage imbriquée.
rbassett
1
Le paramètre par page ne semble pas fonctionner pour les projets ciblant .NET 4.6.1.
Dennis T --Reinstate Monica--
56

Je sais que c'est une vieille question, mais si vous rencontrez ce problème dans MVC 3, vous pouvez décorer votre ActionMethodavec [ValidateInput(false)]et simplement désactiver la validation de la demande pour un seul ActionMethod, ce qui est pratique. Et vous n'avez pas besoin d'apporter de modifications au web.configfichier, vous pouvez donc toujours utiliser la validation de demande .NET 4 partout ailleurs.

par exemple

[ValidateInput(false)]
public ActionMethod Edit(int id, string value)
{
    // Do your own checking of value since it could contain XSS stuff!
    return View();
}
Tom Chantler
la source
1
@RossCooper ceci est pour asp.net MVC uniquement
mxmissile
28

Cela fonctionne sans changer le mode de validation.

Vous devez utiliser un System.Web.Helpers.Validation.Unvalidatedassistant de System.Web.WebPages.dll. Il va retourner un UnvalidatedRequestValuesobjet qui permet d'accéder au formulaire et QueryString sans validation.

Par exemple,

var queryValue = Server.UrlDecode(Request.Unvalidated("MyQueryKey"));

Fonctionne pour moi pour MVC3 et .NET 4.

Assassin
la source
1
Pouvez-vous s'il vous plaît fournir un exemple de la façon de récupérer une queryString avec cette méthode? Je continue à recevoir «Non validé n'est pas membre de ...» tous les objets auxquels j'essaie de l'ajouter. Je pense qu'il me manque peut-être une inclusion
CodedMonkey
3
var queryValue = Server.UrlDecode (Request.Unvalidated ("MyQueryKey"));
sfuqua
1
Cela devrait certainement être la réponse acceptée. Maintient la sécurité et est extrêmement flexible puisque vous pouvez l'utiliser sur une base sélective.
cmartin le
Pour les formulaires Web, vous devez remplacer l'entrée dans la collection QueryString pour éviter une erreur de validation - voir Une valeur Request.QueryString potentiellement dangereuse a été détectée à partir du client lors de l'envoi de balisage html de l'appel jquery post à la page asp.net
Michael Freidgeim
15

Notez qu'une autre approche consiste à conserver le comportement de validation 4.0, mais à définir votre propre classe qui dérive de RequestValidatoret définit:

<httpRuntime requestValidationType="YourNamespace.YourValidator" />

(où YourNamespace.YourValidatorest bien, vous devriez être capable de deviner ...)

De cette façon, vous conservez les avantages du comportement de la version 4.0 (en particulier, que la validation se produit plus tôt dans le traitement), tout en autorisant également les requêtes que vous devez laisser passer.

Jon Hanna
la source
7
C'est bon à savoir. Mais je pense toujours que toute la fonctionnalité de validation des demandes d'ASP.Net est erronée. L'entrée elle-même n'est pas le problème, c'est ce que vous en faites . Il peut être parfaitement valide d'accepter du code SQL, HTML ou JavaScript comme entrée dans votre application, à condition que vous l'encodiez / l'échappiez correctement avant de le sortir ou de le stocker dans votre base de données.
Jordan Rieger
2
@JordanRieger Je suis en partie d'accord. OOTB, il a au moins l'avantage de passer par défaut pour sécuriser (ne réfléchissez pas et vous obtenez des erreurs, plutôt que 0wned), mais c'est un peu gênant et le comportement pré-4.0 est très tout ou rien. Il y a quelque chose dans la possibilité d'avoir une couche de validation qui est utilisée avant tout autre traitement, comme avec un requestValidationType personnalisé, mais beaucoup de validation doit être plus liée à d'autres traitements. Dans l'ensemble, je pense qu'il fait plus pour protéger les personnes ayant de mauvaises habitudes de certains (mais pas tous) fractionnements que pour encourager les bonnes habitudes.
Jon Hanna