잠재적으로 위험한 요청입니다.jquery post call에서html 마크업을 asp.net 페이지로 전송할 때 클라이언트에서 QueryString 값이 검출되었습니다.
ASP에 jQuery를 사용하여 Ajax 콜을 발신하고 있습니다.쿼리 문자열에 보내는 데이터를 저장하기 위한 내 Ajax 서버 페이지 역할을 하는 NET 페이지입니다.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<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자세한 내용은 다음 StackOverflow 질문을 참조하십시오.requestValidationMode.
이에 대한 좋은 답변이 이미 있습니다. 링크를 클릭하지 않아도 되도록 여기에 정보를 제공합니다.
ASP 실행 시.NET 4.0, web.config 파일에서 다음을 설정해야 합니다.RequestValidationMode="2.0".
이 물건은 무엇에 쓰는 겁니까?
어떤 ASP를 나타내는 값.검증에는, NET 버전 고유의 어프로치가 사용됩니다.기본값은 4.0 입니다.
가능한 값은 무엇일까요?
-
4.0(디폴트).HttpRequest 객체는 내부적으로 요청 검증이 트리거되는 것을 나타내는 플래그를 설정합니다.
HTTP 요청 데이터에 액세스합니다.이를 통해 요청은
쿠키나 URL 등의 데이터가 전송되기 전에 검증이 트리거됩니다.
액세스 할 수 있습니다.의 요구 검증 설정
컨피규레이션파일 또는 @ 페이지의 pages 요소(존재하는 경우)
각 페이지의 지시문은 무시됩니다. -
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 메서드 분석: Cross Site Scripting Validation.IsDangerousString
완료.5 모드 4.5.2의 )RequestValidationMode="2.0".
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;
}
내 경우 [Http Post]에 [Http Post, Validate]가 있는 대신입력(거짓)으로 문제를 해결했다.컨트롤러 액션코드의 예는 다음과 같습니다.
[HttpPost, ValidateInput(false)]
[AcceptVerbs(HttpVerbs.Post)]
[ValidateAntiForgeryToken]
public ActionResult UploadFile(HttpPostedFileBase blob)
{
//your action code here
}
asp 페이지 상단에 ValidateRequest="false"를 설정합니다.
언급URL : https://stackoverflow.com/questions/3885697/a-potentially-dangerous-request-querystring-value-was-detected-from-the-client-w
'programing' 카테고리의 다른 글
| Reactjs에서 {...this.props}의 의미는 무엇입니까? (0) | 2023.03.02 |
|---|---|
| Redux Reduce를 Reduceer라고 하는 이유는 무엇입니까? (0) | 2023.03.02 |
| WordPress Admin에 커스텀 Javascript를 추가하는 방법 (0) | 2023.03.02 |
| 각진 표현 {{:}} 안에 있는 두 개의 콜론은 무엇을 의미합니까? (0) | 2023.03.02 |
| 속성 'assign'이 'ObjectConstructor' 유형에 없습니다. (0) | 2023.03.02 |