programing

EscapeUriString과 EscapeDataString의 차이점은 무엇입니까?

starjava 2023. 5. 12. 20:08
반응형

EscapeUriString과 EscapeDataString의 차이점은 무엇입니까?

URL 인코딩만 다루는 경우 EscapeUriString을 사용해야 합니까?

저는 기존의 답변이 만족스럽지 못해서 이 문제를 해결하기 위해 조금 더 깊이 파고들기로 했습니다.놀랍게도 답은 매우 간단합니다.

사용해야 할 타당한 이유는 거의 없습니다. 문자열을 백분율로 인코딩해야 하는 경우 항상 .*사용합니다.

유효한 사용 사례는 마지막 단락을 참조하십시오.

왜 이러한가?설명서에 따르면:

EscapeUriString 메서드를 사용하여 URI 생성자에 대한 매개 변수가 될 이스케이프되지 않은 URI 문자열을 준비합니다.

이건 정말 말이 안 돼요.RFC 2396에 따라:

완료된 URI를 이스케이프하거나 이스케이프 해제하면 의미가 변경될 수 있으므로 URI는 항상 "에스케이프" 형식입니다.

인용된 RFC는 RFC 3986에 의해 폐기되었지만, 요점은 여전히 유효합니다.몇 가지 구체적인 예를 살펴봄으로써 검증해 보겠습니다.

  1. 다음과 같은 간단한 URI가 있습니다.

     http://example.org/
    

Uri.EscapeUriString바꾸지 않을 겁니다.

  1. 이스케이프와 관계없이 쿼리 문자열을 수동으로 편집하기로 결정합니다.

     http://example.org/?key=two words
    

Uri.EscapeUriString다음과 같이 공간을 이스케이프합니다.

    http://example.org/?key=two%20words
  1. 쿼리 문자열을 수동으로 편집하기로 결정합니다.

     http://example.org/?parameter=father&son
    

그러나 이 문자열은 다음에 의해 변경되지 않습니다.Uri.EscapeUriString암페어샌드가 다른 키-값 쌍의 시작을 의미한다고 가정하기 때문입니다.이것은 당신이 의도한 것일 수도 있고 아닐 수도 있습니다.

  1. 당신은 사실 당신이 원하는 것을 결정합니다.key be 될개 변수매father&son따라서 앰퍼샌드를 이스케이프하여 이전 URL을 수동으로 수정합니다.

     http://example.org/?parameter=father%26son
    

하만지,Uri.EscapeUriString백분율 문자도 이스케이프되어 이중 인코딩이 발생합니다.

    http://example.org/?parameter=father%2526son

피시다를 사용해서, 용사.Uri.EscapeUriString의도된 목적 때문에 사용할 수 없습니다.&여러 키-값 쌍 사이의 구분자 대신 쿼리 문자열에서 키 또는 값의 일부로 사용됩니다.

이는 전체 URI를 이스케이프하는 데 적합하도록 만들기 위해 예약된 문자를 무시하고 예약되지 않았거나 예약되지 않은 문자만 이스케이프하기 때문이며, BTW는 문서에 반하는 것입니다.이런 식으로 당신은 결국 이런 것을 얻지 못합니다.http%3A%2F%2Fexample.org%2F하지만 위에서 설명한 문제가 발생합니다.


하면 URI 변수로 합니다.Uri.EscapeUriString마법의 해결책도 아닙니다.사실, 대부분은 아니더라도 많은 경우에 효과가 있겠지만, 결코 신뢰할 수 있는 것은 아닙니다.

항상 키-값 쌍 및 퍼센트 인코딩을 수집한 다음 필요한 구분 기호와 연결하여 URL 및 쿼리 문자열을 구성해야 합니다.사용할 수 있습니다.Uri.EscapeDataString이 목적을 위해, 그러나 그렇지 않습니다.Uri.EscapeUriString위에서 언급한 것처럼 예약된 문자를 벗어나지 않기 때문입니다.

URI를 다룰 때와 수 에만 사용자가 제공한 URI를 사용하는 합니까?Uri.EscapeUriString에서 언급한 사항이됩니다. 않을 수 .그러나 앞서 언급한 주의 사항이 적용됩니다. 사용자가 제공한 URI가 모호할 경우 결과가 바람직하지 않을 수 있습니다.

사용하다EscapeDataString항상(이유에 대한 자세한 내용은 아래 리브벤의 답변 참조)

편집: 인코딩에서 두 가지가 어떻게 다른지에 대한 데드 링크 제거했습니다.

더하기(+) 문자는 이러한 방법 간의 차이를 많이 나타낼 수 있습니다.단순 URI에서 더하기 문자는 "공백"을 의미합니다.구글에 "행복한 고양이"를 문의하는 것을 고려해 보십시오.

https://www.google.com/ ?q=happy+cat

은 유효한 URI it이며, "URI"("URI")입니다.EscapeUriString수정하지 않습니다.

이제 Google에 "happy c++"를 문의하는 것을 고려해 보십시오.

https://www.google.com/ ?q=happy+c++

유효한 URI이지만 "happy c"에 대한 검색을 생성합니다. 두 더하기가 공백으로 해석되기 때문입니다.그것을 고치기 위해, 우리는 "행복한 c++"를 전달할 수 있습니다.EscapeDataString그리고* voila:

https://www.google.com/ ?q=happy+c%2B%2B

인코딩된 데이터 문자열은 실제로 "happy%20c%2B%2"*)입니다.B"; %20은 공백 문자의 경우 16진수이고 %2B는 더하기 문자의 경우 16진수입니다.

를 사용하는 UriBuilder그래야만 하는 것처럼, 그러면 당신은 단지 필요할 뿐입니다.EscapeDataString 중 탈출하기 @은 URI를 증명합니다. @이 질문에 대한 Liven의 대답은 사용할 이유가 없다는 것을 더욱 증명합니다.EscapeUriString.

소스의 코멘트는 그 차이를 명확하게 설명합니다.이 정보가 XML 문서 주석을 통해 전달되지 않는 이유는 저에게 수수께끼입니다.

UriString 탈출:

이 메서드는 백분율 기호를 포함하여 예약되었거나 예약되지 않은 문자가 아닌 모든 문자를 이스케이프합니다.EscapeUriString도 '#' 기호를 벗어나지 않습니다.

이스케이프 데이터 문자열:

이 메서드는 백분율 기호를 포함하여 예약되지 않은 문자가 아닌 모든 문자를 이스케이프합니다.

그래서 차이점은 예약된 캐릭터를 다루는 방법에 있습니다. EscapeDataString; 그을피합다니들;다;EscapeUriString하지 않다.

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

위해 되지 않은 와 완을위예지않은문고영이숫자자는입니다.-._~

두 메서드 모두 예약되지 않았거나 예약되지 않은 문자를 이스케이프합니다.

저는 일반적인 생각에 동의하지 않습니다.EscapeUriString사악합니다.예약된 문자가 아닌 잘못된 문자(예: 공백)만 이스케이프하는 방법이 유용하다고 생각합니다.하지만 그것은 그것이 어떻게 그것을 다루는지에 특이점을 가지고 있습니다.%퍼센트 인코딩 문자(% 인코딩 문자)%URI에서는 두 자리 숫자 뒤에 오는 16진수)가 유효합니다.생각합니다EscapeUriString하고 인코딩을 더 입니다.%두 개의 16진수로 즉시 진행될 때.

간단한 예

var data = "example.com/abc?DEF=あいう\x20えお";

Console.WriteLine(Uri.EscapeUriString(data));
Console.WriteLine(Uri.EscapeDataString(data));
Console.WriteLine(System.Net.WebUtility.UrlEncode(data));
Console.WriteLine(System.Web.HttpUtility.UrlEncode(data));

/*
=>
example.com/abc?DEF=%E3%81%82%E3%81%84%E3%81%86%20%E3%81%88%E3%81%8A
example.com%2Fabc%3FDEF%3D%E3%81%82%E3%81%84%E3%81%86%20%E3%81%88%E3%81%8A
example.com%2Fabc%3FDEF%3D%E3%81%82%E3%81%84%E3%81%86+%E3%81%88%E3%81%8A
example.com%2fabc%3fDEF%3d%e3%81%82%e3%81%84%e3%81%86+%e3%81%88%e3%81%8a
*/

암호화된 문자열을 Url Parameter(예: http://example.com/Test/myencryptedkey/param2/param3) )로 사용하고 있었기 때문에 C# 암호화 방법 중 어떤 것도 안전한 URL Parameter를 제공할 수 없었습니다.저는 결국 다음과 같은 패턴을 사용하게 되었습니다.

중: 암화중 호:Uri.EscapeDataString(myencryptedkey).Replace('%', '~');

해독 중: 암호해중독:Uri.UnescapeDataString(myencryptedkey.Replace('~', '%'));

암호화 중에는 EscapeDataString() 이후에 교체가 이루어지며, 암호 해독 중에는 UnescapeDataString() 이전에 교체가 이루어집니다.

언급URL : https://stackoverflow.com/questions/4396598/whats-the-difference-between-escapeuristring-and-escapedatastring

반응형