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

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

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, он отлично работает.

Ответ 2

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

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

Для чего это свойство?

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

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

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

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

Информация, указанная на этом сайте msdn.

Ответ 3

Если вы хотите добавить пользовательскую логику проверки для одной конкретной страницы 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".

Ответ 4

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

Ответ 5

Я создал пару многоразовых методов на основе ответа 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;
        }