Potentiellement dangereuse Demande.La valeur de QueryString a été détectée par le client lors de l'envoi de la balise html de jquery post à asp.net page 2

I m making an ajax call using jQuery to an ASP.NET page qui agit comme ma page serveur ajax pour enregistrer les données que je lui envoie dans la chaîne de requête. Dans ASP.NET page quand j'essaie de lire le querystring, j'obtiens cette erreur:

A potentially dangerous Request.QueryString value was detected from the client...

j'ai mis le ValidateRequest="false" dans ma page. Ne veux pas le mettre pour toutes les pages. Il en a été de même au niveau de la page au lieu du niveau de la configuration:

  var content = "<h3>Sample header</h3><p>sample para</p>"
  content = encodeURIComponent(content);
  var url = "../Lib/ajaxhandler.aspx?mode=savecontent&page=home&ltxt=" + content;

     $.post(url, function (data) { 
       //check return value and do something
   });

et dans mon asp.net page 2:

 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ajaxhandler.aspx.cs" ValidateRequest="false" Inherits="MyProject.Lib.ajaxhandler" %>

mais quand j'envoie du texte clair au lieu du balisage html, ça marche très bien.

36
demandé sur Jim Aho 2010-10-08 00:39:29

5 réponses

si c'est ASP.NET 4, Il y avait un changement de rupture avec ValidateRequest . Voir cette question sur le débordement des piles pour plus d'information sur requestValidationMode .

34
répondu Forgotten Semicolon 2017-05-23 11:54:55

il y a déjà une bonne réponse pour cela, et ici je vais fournir l'information pour que vous n'ayez pas à cliquer à travers les liens.

en cours D'exécution ASP.NET 4.0, vous aurez besoin de définir ce qui suit dans votre web.fichier de configuration RequestValidationMode="2.0" .

à quoi sert cette propriété?

une valeur qui indique ASP.NET approche axée sur la version la validation sera utilisée. La valeur par défaut est de 4.0.

Alors, quelles sont les valeurs possibles?

  • 4.0 (valeur par défaut). L'objet HttpRequest configure en interne un drapeau qui indique que la validation de la requête doit être déclenchée chaque fois qu'un

    Les données de requête HTTP sont accessibles. Cela garantit que la demande

    la validation est déclenchée avant que les données telles que les cookies et les URLs ne soient

    accéder lors de la demande. Les paramètres de validation de la requête du

    élément pages (s'il y a lieu) dans le fichier de configuration ou de @ Page

    directive dans une page individuelle sont ignorées.

  • 2.0. La validation des requêtes N'est activée que pour les pages, pas pour toutes les requêtes HTTP. En outre, les paramètres de validation des requêtes des pages élément (le cas échéant) dans le fichier de configuration ou de la directive @ Page dans une page individuelle sont utilisés pour déterminer les demandes de page à valider.

Informations citated à partir de ce site msdn.
8
répondu Jim Aho 2015-01-19 14:12:01

si vous voulez ajouter une logique de validation personnalisée pour une ASP.NET page ou pour un ou plusieurs paramètres de la chaîne de requête sans définir ValidateRequest="false" pour une page entière - la solution "hacky" suivante pourrait être utile:

public partial class MyPage : System.Web.UI.Page
{
    private string SomeUnvalidatedValue { get; set; }

    public override void ProcessRequest(HttpContext context)
    {
        var queryString = context.Request.QueryString;

        var readOnly = queryString.GetType().GetProperty("IsReadOnly",
            System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);

        readOnly.SetValue(queryString, false);

        var unvalidatedValue = context.Request.Unvalidated.QueryString["SomeKey"];
        // for RequestValidationMode="2.0"
        //var unvalidatedValue = context.Request.QueryString["SomeKey"];

        // custom logic goes here

        // you could store unvalidated value here and then remove it from the query string
        SomeUnvalidatedValue = unvalidatedValue;
        queryString["SomeKey"] = string.Empty;
        // or just remove all "potentially dangerous" symbols, for example
        if (!string.IsNullOrEmpty(unvalidatedValue))
        {
            queryString["SomeKey"] = Regex.Replace(unvalidatedValue,
                "(\<+[a-z!/\?])|(&\#)", new MatchEvaluator((m) =>
                {
                    return m.Value.Replace("<", string.Empty).Replace("&#", string.Empty);
                }), RegexOptions.IgnoreCase);
        }

        readOnly.SetValue(queryString, true);

        // keep other request validation logic as is
        base.ProcessRequest(context);
    }
}

l'expression régulière faite à la suite de cette ASP.NET méthode d'analyse: CrossSiteScriptingValidation.IsDangerousString

Code

testé avec .NET 4.5.2, IIS integrated mode, avec et sans RequestValidationMode="2.0" .

2
répondu VAV 2017-05-26 14:57:14

j'ai créé quelques méthodes réutilisables basées sur réponse de VAV

   public static string ExtractUnvalidatedValue(HttpRequest request, string key)
        {
            var unvalidatedValue =  HttpUtility.UrlDecode(request.Unvalidated.QueryString[key]);
            // for RequestValidationMode="2.0"
            //var unvalidatedValue = context.Request.QueryString["SomeKey"];

          // remove all "potentially dangerous" symbols
            return ReplacePotentiallyDangerousSymbols(unvalidatedValue, string.Empty);
        }

    public static string ReplacePotentiallyDangerousSymbols(string unvalidatedValue, string valueToReplace="")
        {
            if (!string.IsNullOrEmpty(unvalidatedValue))
            {
                //The regular expression made as result of this ASP.NET method analyzing: CrossSiteScriptingValidation.IsDangerousString http://referencesource.microsoft.com/#System.Web/CrossSiteScriptingValidation.cs,3c599cea73c5293b
                unvalidatedValue = Regex.Replace(unvalidatedValue,
                    "(\<+[a-z!/\?])|(&\#)",
                    new MatchEvaluator((m) => { return m.Value.Replace("<", valueToReplace).Replace("&#", valueToReplace); }), RegexOptions.IgnoreCase);
            }
            return unvalidatedValue;
        }
1
répondu Michael Freidgeim 2017-06-09 11:09:58

set ValidateRequest=" false " en haut de la page asp.

-1
répondu Deepu R Nair 2013-09-04 05:00:11