Validation de la demande - Prévention des attaques de script

Ce document décrit la fonctionnalité de validation des demandes de ASP.NET où, par défaut, l’application n’est pas en mesure de traiter le contenu HTML non codé envoyé au serveur. Cette fonctionnalité de validation de requête peut être désactivée lorsque l’application a été conçue pour traiter en toute sécurité les données HTML.

S’applique à ASP.NET 1.1 et ASP.NET 2.0.

La validation de la demande, une fonctionnalité de ASP.NET depuis la version 1.1, empêche le serveur d’accepter du contenu contenant du code HTML non codé. Cette fonctionnalité est conçue pour empêcher certaines attaques par injection de script, par lesquelles le code de script client ou HTML peut être soumis à un serveur, stocké, puis présenté à d’autres utilisateurs. Nous vous recommandons toujours vivement de valider toutes les données d’entrée et le code HTML le cas échéant.

Par exemple, vous créez une page Web qui demande l’adresse e-mail d’un utilisateur, puis stocke cette adresse e-mail dans une base de données. Si l’utilisateur entre <une alerte SCRIPT>(« hello from script »)</SCRIPT> au lieu d’une adresse e-mail valide, lorsque ces données sont présentées, ce script peut être exécuté si le contenu n’a pas été correctement encodé. La fonctionnalité de validation de la demande de ASP.NET empêche ce problème.

Pourquoi cette fonctionnalité est utile

De nombreux sites ne savent pas qu’ils sont ouverts à des attaques par injection de script simples. Que l’objectif de ces attaques soit de défigurer le site en affichant du code HTML, ou de potentiellement exécuter un script client pour rediriger l’utilisateur vers le site d’un pirate, les attaques par injection de scripts sont un problème que les développeurs Web doivent gérer.

Les attaques par injection de script concernent tous les développeurs web, qu’ils utilisent ASP.NET, ASP ou d’autres technologies de développement web.

La fonctionnalité de validation de requête ASP.NET empêche de manière proactive ces attaques en n’autorisant pas le traitement du contenu HTML non codé par le serveur, sauf si le développeur décide d’autoriser ce contenu.

Ce à quoi s’attendre : page d’erreur

La capture d’écran ci-dessous montre un exemple de code ASP.NET :

Capture d’écran montrant un exemple de code ASP.NET.

L’exécution de ce code entraîne une page simple qui vous permet d’entrer du texte dans la zone de texte, de cliquer sur le bouton et d’afficher le texte dans le contrôle d’étiquette :

Capture d’écran montrant l’exécution de ce code génère une page simple qui vous permet d’entrer du texte dans la zone de texte, de cliquer sur le bouton et d’afficher le texte dans le contrôle d’étiquette.

Toutefois, JavaScript, tel que <script>alert("hello!")</script> être entré et envoyé, nous obtiendrions une exception :

Si JavaScript est entré et envoyé, une exception est générée.

Le message d’erreur indique qu’une valeur Request.Form potentiellement dangereuse a été détectée et fournit plus de détails dans la description concernant exactement ce qui s’est produit et comment modifier le comportement. Par exemple:

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 compromission de la sécurité de votre application, telle qu’une attaque par script intersites. Vous pouvez désactiver la validation des demandes en définissant validateRequest=false soit dans la directive Page, soit dans la section de configuration. Toutefois, il est fortement recommandé que votre application vérifie explicitement toutes les entrées dans ce cas.

Désactivation de la validation des demandes sur une page

Pour désactiver la validation des demandes sur une page, vous devez définir l’attribut validateRequest de la directive Page sur false:

<%@ Page validateRequest="false" %>

Avertissement

Lorsque la validation de la demande est désactivée, le contenu peut être envoyé à une page ; il incombe au développeur de pages de s’assurer que le contenu est correctement encodé ou traité.

Désactivation de la validation des demandes pour votre application

Pour désactiver la validation des demandes pour votre application, vous devez modifier ou créer un fichier Web.config pour votre application et définir l’attribut validateRequest de la <pages /> section sur false:

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

Si vous souhaitez désactiver la validation des demandes pour toutes les applications sur votre serveur, vous pouvez apporter cette modification à votre fichier Machine.config.

Avertissement

Lorsque la validation de la demande est désactivée, le contenu peut être envoyé à votre application ; il incombe au développeur d’applications de s’assurer que le contenu est correctement encodé ou traité.

Le code ci-dessous est modifié pour désactiver la validation des demandes :

Capture d’écran montrant le code ci-dessous modifié pour désactiver la validation des demandes.

Maintenant, si le code JavaScript suivant a été entré dans la zone <script>alert("hello!")</script> de texte, le résultat serait :

Capture d’écran montrant si javaScript a été entré dans la zone de texte : le résultat serait un bouton « Cliquez sur moi ! » et une boîte de dialogue qui indique « hello ! ».

Pour éviter cela, avec la validation de la demande désactivée, nous devons encoder le contenu au format HTML.

Guide pratique pour encoder du contenu html

Si vous avez désactivé la validation de la demande, il est recommandé d’encoder du contenu html qui sera stocké pour une utilisation ultérieure. L’encodage HTML remplace automatiquement tout «< » ou «> » (avec plusieurs autres symboles) par leur représentation encodée HTML correspondante. Par exemple, '' est remplacé par '<' et '' est remplacé par '>'. Les navigateurs utilisent ces codes spéciaux pour afficher le «< » ou «> » dans le navigateur.

Le contenu peut être facilement codé au format HTML sur le serveur à l’aide de l’API Server.HtmlEncode(string) . Le contenu peut également être facilement décodé au format HTML, c’est-à-dire rétabli au format HTML standard à l’aide de la Server.HtmlDecode(string) méthode.

Capture d’écran montrant que le contenu peut être facilement codé au format HTML sur le serveur à l’aide de l’API Server.HtmlEncode(string). Le contenu peut également être facilement décodé au format HTML, c’est-à-dire rétabli au format HTML standard à l’aide de la méthode Server.HtmlDecode(string).

Ce qui donne :

Capture d’écran montrant un bouton « Cliquez sur moi ! » et un message d’entrée JavaScript réussi dans la zone de texte.