Потенциально опасное значение Request.QueryString было обнаружено клиентом при отправке html-разметки из пост-вызова jquery на страницу asp.net. - PullRequest
40 голосов
/ 08 октября 2010

Я делаю вызов ajax, используя jQuery для страницы ASP.NET, которая действует как моя страница сервера ajax для сохранения данных, которые я посылаю ему, в строке запроса. На странице ASP.NET, когда я пытаюсь прочитать строку запроса, я получаю эту ошибку:

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

Я установил ValidateRequest="false" на своей странице. Не хочу устанавливать его для всех страниц. Так же и на уровне страницы, а не на уровне конфигурации:

  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
   });

и на моей странице asp.net:

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

Но когда я отправляю простой текст вместо разметки html, он работает нормально.

Ответы [ 5 ]

36 голосов
/ 08 октября 2010

Если это ASP.NET 4, было критическое изменение с ValidateRequest.См. этот вопрос StackOverflow для получения дополнительной информации о requestValidationMode.

8 голосов
/ 19 января 2015

На этот вопрос уже есть хороший ответ, и здесь я предоставлю информацию, чтобы вам не приходилось нажимать на ссылки.

При запуске ASP.NET 4.0 вам необходимо установить следующее в файле web.config RequestValidationMode="2.0".

Для чего эта недвижимость?

Значение, указывающее, какой подход к ASP.NET для конкретной версии проверка будет использоваться. По умолчанию установлено значение 4.0.

Так, каковы возможные значения?

  • 4.0 (по умолчанию). Объект HttpRequest внутренне устанавливает флаг, который указывает, что проверка запроса должна запускаться всякий раз, когда любой
    Доступ к данным HTTP-запроса. Это гарантирует, что запрос
    проверка запускается до того, как такие данные, как файлы cookie и URL-адреса
    доступ во время запроса. Запрос проверки параметров настройки
    элемент pages (если есть) в файле конфигурации или в @ Page
    директивы на отдельной странице игнорируются.

  • 2,0. Проверка запросов включена только для страниц, а не для всех HTTP-запросов. Кроме того, запрос проверки параметров страниц элемент (если есть) в файле конфигурации или директивы @ Page на отдельной странице используются для определения того, какая страница запрашивает проверки.

Информация с этого сайта MSDN.
2 голосов
/ 26 мая 2017

Если вы хотите добавить пользовательскую логику проверки для одной конкретной страницы ASP.NET или для одного или нескольких параметров строки запроса без установки ValidateRequest="false" для всей страницы - может пригодиться следующее «хакерское» решение:

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);
    }
}

Регулярное выражение, созданное в результате анализа этого метода ASP.NET: CrossSiteScriptingValidation.IsDangerousString

Код, протестированный с .NET 4.5.2, интегрированный режим IIS, с и безRequestValidationMode="2.0".

1 голос
/ 09 июня 2017

Я создал пару методов многократного использования на основе ответа 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;
        }
0 голосов
/ 04 сентября 2013

set ValidateRequest = "false" в верхней части страницы asp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...