Ответ 1
Если это ASP.NET 4, нарушение изменений с ValidateRequest
. См. fooobar.com/questions/2900/... для получения дополнительной информации о requestValidationMode
.
Я делаю вызов 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<xt=" + 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, он отлично работает.
Если это ASP.NET 4, нарушение изменений с ValidateRequest
. См. fooobar.com/questions/2900/... для получения дополнительной информации о requestValidationMode
.
У нас уже есть хороший ответ, и здесь я предоставлю информацию, чтобы вам не пришлось перебирать ссылки.
При запуске ASP.NET 4.0 вам нужно будет установить следующее в файле web.config RequestValidationMode="2.0"
.
Для чего это свойство?
Значение, указывающее, какой ASP.NET-подход к версии будет использоваться валидация. Значение по умолчанию - 4.0.
Итак, каковы возможные значения?
4.0 (по умолчанию). Объект HttpRequest внутренне устанавливает флаг, который указывает, что проверка запроса должна запускаться всякий раз, когда любой Доступ к данным HTTP-запроса. Это гарантирует, что запрос проверка выполняется до того, как данные, такие как файлы cookie и URL-адреса, доступ во время запроса. Настройки проверки запроса в страницы (если есть) в файле конфигурации или на странице @ директива на отдельной странице игнорируется.
2,0. Проверка запроса разрешена только для страниц, а не для всех HTTP-запросов. Кроме того, параметры проверки запроса на страницах элемент (если есть) в файле конфигурации или директивы @Page на отдельной странице используются для определения того, какая страница запрашивает проверки.
Если вы хотите добавить пользовательскую логику проверки для одной конкретной страницы 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"
.
установите ValidateRequest = "false" в верхней части страницы asp.
Я создал пару многоразовых методов на основе ответа 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;
}