programing

Server.UrlEncode 대Http 유틸리티.UrlEncode

mailnote 2023. 5. 6. 15:17
반응형

Server.UrlEncode 대Http 유틸리티.UrlEncode

서버 간에 차이가 있습니까?UrlEncode 및 HttpUtility.URLEncode?

저는 이전에 이러한 방법들로 상당한 두통을 겪었습니다. 저는 당신이 어떤 변형도 피하고 대신에 적어도 이해할 수 있는 행동을 하는 것을 사용할 것을 권장합니다.

어디 보자꾸나...

HttpUtility.UrlEncode(" ") == "+" //breaks ASP.NET when used in paths, non-
                                  //standard, undocumented.
Uri.EscapeUriString("a?b=e") == "a?b=e" // makes sense, but rarely what you
                                        // want, since you still need to
                                        // escape special characters yourself

하지만 제가 개인적으로 가장 좋아하는 것은 Http Utility입니다.UrlPathEncode - 이것은 정말 이해할 수 없습니다.다음을 인코딩:

  • " " ==> "%20"
  • "100% 참" ==> "100%% 20 참" (ok, 너의 URL은 지금 깨졌어)
  • "test A.aspx #앵커 B" ==> "test%20A.aspx #앵커%20B"
  • "test A.aspx?hmm#앵커 B" ==> "test%20A.aspx?hmm#앵커 B" (이전 이스케이프 시퀀스와의 차이점에 유의하십시오!)

또한 "웹 서버에서 클라이언트로 안정적인 HTTP 전송을 위해 URL 문자열의 경로 부분을 인코딩합니다."라는 내용의 MSDN 문서도 포함되어 있지만 실제로는 이 문자열이 수행하는 작업에 대해서는 설명하지 않습니다.당신은 우지로 당신의 발을 쏠 가능성이 적습니다.

간단히 말해서, 우리당을 고수하세요.데이터 문자열을 이스케이프합니다.

HttpServerUtility.UrlEncode을 사용합니다.HttpUtility.UrlEncode차이는 .특별한 차이는 없습니다.의 존재 Server.UrlEncode클래식 ASP와 호환됩니다.

이 질문이 처음 제기된 지 거의 9년이 지났고 의 세계에서 빠르게 진행됩니다.NET Core 및 .NET Standard, URL 인코딩에 대한 가장 일반적인 옵션은 WebUtility인 것 같습니다.UrlEncode(아래)System.Net) 및 우리당.데이터 문자열을 이스케이프합니다.여기와 다른 곳에서 가장 인기 있는 대답으로 판단하면, 우리당입니다.EscapeDataString이 더 좋은 것 같습니다.하지만 그럴까요?저는 차이점을 이해하기 위해 몇 가지 분석을 실시했고, 다음과 같은 결과를 얻었습니다.

  • WebUtility.UrlEncode을 공간인딩으로 합니다.+;Uri.EscapeDataString 니다합딩코로 합니다.%20.
  • Uri.EscapeDataString 백화부!,(,),그리고.*;WebUtility.UrlEncode하지 않다.
  • WebUtility.UrlEncode 백화부~;Uri.EscapeDataString하지 않다.
  • Uri.EscapeDataString던지다, 던지다UriFormatException긴; 65,000자 이상인 경우WebUtility.UrlEncode그렇지 않습니다. (특히 URL 인코딩 폼 데이터를 처리할 때 생각보다 일반적인 문제입니다.)
  • Uri.EscapeDataString던지다, 던지다UriFormatException높은 대리 캐릭터에;WebUtility.UrlEncode그렇지 않습니다. (그것은 UTF-16의 일이고, 아마도 훨씬 덜 일반적일 것입니다.)

URL 인코딩을 위해 문자는 예약되지 않음(URL에서 합법적), 예약됨(법적이지만 특별한 의미가 있으므로 인코딩할 수 있음) 및 기타 모든 항목(항상 인코딩되어야 함)의 세 가지 범주 중 하나로 적합합니다.

RFC에 따르면 예약된 문자는 다음과 같습니다.:/?#[]@!$&'()*+,;=

그리고 예약되지 않은 문자는 영숫자이고-._~

평결

Uri.EscapeDataString은 미션을 명확하게 정의합니다. %-모든 예약된 문자와 잘못된 문자를 인코딩합니다.웹 유틸리티.UrlEncode는 정의와 구현 모두에서 더 모호합니다.이상하게도, 그것은 일부 예약된 문자는 인코딩하지만 다른 문자는 인코딩하지 않습니다(괄호가 아닌 괄호는 왜?). 그리고 낯선 사람은 여전히 순수하게 예약되지 않은 문자를 인코딩합니다.~성격.

그러므로, 저는 URI를 사용하라는 대중적인 조언에 동의합니다.가능한 경우 DataString을 이스케이프하고 예약된 문자가 다음과 같은 것임을 이해합니다./그리고.?암호화됩니다.특히 URL로 인코딩된 양식 콘텐츠와 같이 잠재적으로 큰 문자열을 처리해야 하는 경우 Web Utility에 의존해야 합니다.UrlEncode를 사용하여 문제를 해결하거나 문제를 해결합니다.


편집: 위에서 언급한 모든 특이점을 수정하려고 시도했습니다.Url.Encode,Url.EncodeIllegalCharacters,그리고.Url.Decode정적 방법이것들은 코어 패키지(작고 모든 HTTP 내용이 포함되어 있지 않음)에 들어 있거나 소스에서 자유롭게 복사할 수 있습니다.이에 대한 귀하의 의견/피드백을 환영합니다.


다른 방식으로 인코딩된 문자를 검색하는 데 사용한 코드는 다음과 같습니다.

var diffs =
    from i in Enumerable.Range(0, char.MaxValue + 1)
    let c = (char)i
    where !char.IsHighSurrogate(c)
    let diff = new {
        Original = c,
        UrlEncode = WebUtility.UrlEncode(c.ToString()),
        EscapeDataString = Uri.EscapeDataString(c.ToString()),
    }
    where diff.UrlEncode != diff.EscapeDataString
    select diff;

foreach (var diff in diffs)
    Console.WriteLine($"{diff.Original}\t{diff.UrlEncode}\t{diff.EscapeDataString}");

이러한 방법 중 하나를 사용해서는 안 됩니다.마이크로소프트의 사이트스크립팅 방지 라이브러리에는 다음에 대한 대체 기능이 포함되어 있습니다.HttpUtility.UrlEncode그리고.HttpUtility.HtmlEncode표준 준수 및 보안이 향상되었습니다.보스로은, 신당너▁a를 받게 됩니다.JavaScriptEncode방법 또한.

Server.UrlEncode()는 Classic ASP와의 하위 호환성을 제공하기 위해 존재합니다.

Server.UrlEncode(str);

다음과 같음:

HttpUtility.UrlEncode(str, Response.ContentEncoding);

마찬가지로Server.UrlEncode() 출들HttpUtility.UrlEncode()

언급URL : https://stackoverflow.com/questions/602642/server-urlencode-vs-httputility-urlencode

반응형