programing

잠재적으로 위험한 요청입니다.jquery post call에서html 마크업을 asp.net 페이지로 전송할 때 클라이언트에서 QueryString 값이 검출되었습니다.

minxs 2023. 3. 2. 22:39
반응형

잠재적으로 위험한 요청입니다.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&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 마크업 대신 일반 텍스트를 보낼 때는 정상적으로 동작합니다.

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 디렉티브의 요구 검증 설정을 사용하여 검증할 페이지 요구를 결정합니다.

이 msdn 사이트에서 인용된 정보.

특정 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

반응형