source

URI.escape와 CGI.escape의 차이점은 무엇입니까?

manysource 2023. 6. 4. 10:37

URI.escape와 CGI.escape의 차이점은 무엇입니까?

사이에 무슨 차이가 있습니까?URI.escape그리고.CGI.escape그리고 어떤 것을 사용해야 합니까?

도끼와 칼의 차이점은 무엇이고 어떤 것을 사용해야 합니까?여러분이 무엇을 해야 하는지에 달려 있습니다.

URI.escape문자열(URL)을 "백분율 인코딩"으로 인코딩해야 했습니다.

CGI::escape는 웹 서버와 응용 프로그램 간에 데이터를 인코딩/디코딩하는 방법을 설명하는 CGI 사양에서 가져온 것입니다.

이제 앱에서 URI를 이스케이프해야 한다고 가정해 보겠습니다.보다 구체적인 사용 사례입니다.위해 는 이를위루커는티뮤니비해를 했습니다.URI.escape다간는.URI.escapeRFC-3896 사양을 처리할 수 없다는 것이었습니다.

URI.escape 'http://google.com/foo?bar=at#anchor&title=My Blog & Your Blog' 
# => "http://google.com/foo?bar=at%23anchor&title=My%20Blog%20&%20Your%20Blog"

URI.escape사용되지 않는 것으로 표시됨:

또한 현재 URI.encode는 단순 gsub입니다.하지만 URI를 구성 요소로 분할한 다음 각 구성 요소를 제거하고 최종적으로 결합해야 한다고 생각합니다.

따라서 현재 URI.encode는 유해한 것으로 간주되며 더 이상 사용되지 않습니다.이것은 제거되거나 동작이 크게 변경됩니다.

현재 대체품은 무엇입니까?

위에서 말했듯이, 현재 URI.encode는 사양 수준에서 잘못되었습니다.그래서 우리는 정확한 대체품을 제공하지 않을 것입니다.교체는 사용 사례에 따라 달라집니다.

https://bugs.ruby-lang.org/issues/4167

도 없기 에, 아는 상세한 와 함께 하는 것입니다. 그것에 대해 아는 유일한 방법은 소스를 확인하거나 상세한 수준의 경고와 함께 스크립트를 실행하는 것입니다.-wW2(또는 일부 Google-fu 사용).

일부는 사용을 제안했습니다.CGI::Escape 변수의 URI를 수 에 다음과 같이 입력합니다.

CGI::escape 'http://google.com/foo?bar=at#anchor&title=My Blog & Your Blog'
# => "http%3A%2F%2Fgoogle.com%2Ffoo%3Fbar%3Dat%23anchor%26title%3DMy+Blog+%26+Your+Blog"

CGI::escape쿼리 매개 변수에만 사용해야 하지만 결과는 다시 사양에 대해 사용됩니다.실제로 가장 일반적인 사용 사례는 다음과 같은 양식 데이터를 탈출하는 것입니다.application/x-www-form-urlencodedPOST 요청.

언급된 것은 언됨급WEBrick::HTTPUtils.escape많이 개선되지 않았습니다(다시 말하지만 단순합니다).gsub즉, IMO는 더 나쁜 선택입니다.URI.escape):

WEBrick::HTTPUtils.escape 'http://google.com/foo?bar=at#anchor&title=My Blog & Your Blog'
# => "http://google.com/foo?bar=at%23anchor&title=My%20Blog%20&%20Your%20Blog" 

사양에 가장 가까운 것은 주소 지정 가능한 보석인 것 같습니다.

require 'addressable/uri'
Addressable::URI.escape 'http://google.com/foo?bar=at#anchor&title=My Blog & Your Blog'
# => "http://google.com/foo?bar=at#anchor&title=My%20Blog%20&%20Your%20Blog"

옵션과 할 수 없습니다.#그리고 이것이 예상되는 행동입니다.당신은 그것을 유지하기를 원합니다.#해시가 URI 경로에는 있지만 URI 쿼리에는 없습니다.

남은 유일한 문제는 쿼리 매개 변수를 제대로 벗어나지 못했다는 것이며, 이는 결론을 내립니다. (지금까지) 완벽한 솔루션이 없기 때문에 전체 URI에 대해 단일 방법을 사용해서는 안 된다는 것입니다. 바와 같이.&"내 블로그 & 당신의 블로그"에서 벗어나지 못했습니다.사용자가 URL에 특별한 의미를 가진 다른 문자를 넣을 수 있는 쿼리 매개 변수에 대해 다른 형태의 이스케이프를 사용해야 합니다.URL 인코딩을 입력합니다. 쿼리 URL 인코딩을 . 은 "의심스러운" 쿼리 값과 합니다.ERB::Util.url_encode실행:실행:

ERB::Util.url_encode "My Blod & Your Blog"
# => "My%20Blod%20%26%20Your%20Blog""

좋습니다만, 이미 주소 지정이 필요합니다.

uri = Addressable::URI.parse("http://www.go.com/foo")
# => #<Addressable::URI:0x186feb0 URI:http://www.go.com/foo>
uri.query_values = {title: "My Blog & Your Blog"}
uri.normalize.to_s
# => "http://www.go.com/foo?title=My%20Blog%20%26%20Your%20Blog"

결론:

  • 을 사용하지 .URI.escape또는 그와 유사한
  • 사용하다CGI::escape 이스케이프만 하다면,
  • URI로 작업해야 하는 경우 Addressable을 사용하여 URL 인코딩, 양식 인코딩 및 URL 표준화를 제공합니다.
  • 레일즈 프로젝트인 경우 "레일즈에서 문자열을 URL로 이스케이프하려면 어떻게 해야 합니까?"를 확인하십시오.

약간의 차이가 있었지만, 중요한 점은URI.escapeRuby 1.9.2에서 더 이상 사용되지 않으므로 사용하십시오.CGI::escape또는 ERB::Util.url_encode.

관심 있는 사람들을 위한 루비 코어에 대한 긴 토론이 있으며 WEBrick::HTTPUtils.escape 및 WEBrick::HTTPUtils.escape_form.

URI.escape에는 안전하지 않은 항목을 표시할 수 있는 두 번째 매개 변수가 사용됩니다.APIDock 참조:

http://apidock.com/ruby/CGI/escape/class

http://apidock.com/ruby/URI/Escape/escape

CGI::escape텍스트 세그먼트를 이스케이프하는 데 유용하므로 url 쿼리 매개 변수('?' 뒤의 문자열)에서 사용할 수 있습니다. 예를 들어 URL에 슬래시 문자가 포함된 매개 변수를 사용하려면 먼저 CGI::이 문자열을 이스케이프한 다음 URL에 삽입합니다.

그러나 레일즈에서는 직접 사용하지 않을 수도 있습니다.일반적으로 사용하는hash.to_param' 을용사할것다니입다'를 사용할 입니다.CGI::escape후드 밑에


URI::escape제대로 이스케이프되지 않은 URL을 이스케이프하는 데 좋습니다.예를 들어 일부 웹 사이트는 앵커 태그에 잘못된/도피되지 않은 URL을 출력합니다.프로그램에서 이러한 URL을 사용하여 더 많은 리소스를 가져오면 OpenURI에서 URL이 잘못되었다고 불평합니다.당신은 해야 합니다.URI::escape유효한 URL로 만들기 위해 사용합니다.따라서 전체 URI 문자열을 이스케이프하여 적절하게 만드는 데 사용됩니다.URI:: unescape는 사람이 읽을 수 있는 URL을 만들고 URI:: escape는 브라우저에서 유효하게 만듭니다.

이것들은 내 평신도의 용어이고 그것들을 자유롭게 수정할 수 있습니다.

차이점은 URI.escape가 작동하지 않는다는 것입니다...

CGI.escape"/en/test?asd=qwe"
=> "%2Fen%2Ftest%3Fasd%3Dqwe"

URI.escape"/en/test?asd=qwe"
=> "/en/test?asd=qwe"

CGI.escape는 쿼리 문자열의 URL 값을 이스케이프하기 위한 것입니다.ALPHA, DIGITAGE, '_', '-', '.' 및 '' 문자 집합에 속하지 않는 모든 문자는 이스케이프됩니다.

그러나 URL에는 '/', ':', '?', '[, '&', '=' 및 ';'이 있어야 하므로 URL이 잘못됩니다.아마도 나는 내 머리에서 바로 생각할 수 없을 것입니다.

URI.escape는 이러한 URL 문자를 그대로 두고 이스케이프할 쿼리 문자열 키와 값을 찾습니다.그러나 값에는 모든 종류의 문자가 포함되어 있기 때문에 쉽게 탈출할 수 없습니다.기본적으로, 너무 늦었습니다.그러나 URL이 단순하다고 믿을 수 있는 경우(값에 '&' 및 '=' 등이 없음) 이 함수를 사용하여 읽을 수 없거나 잘못된 문자를 이스케이프할 수 있습니다.

일반적으로 -- '&'과 결합하고 '?' 뒤에 추가하기 전에 개별 키와 값에 항상 CGI.escape를 사용합니다.

CGI.escape는 OpenProject API에서 작동하지 않았습니다.+가 아닌 [],:를 인코딩했습니다.OpenProject의 API에 대해 지금까지 작동하는 것으로 보이는 이것을 함께 해킹했습니다.하지만 분명히 어떤 .gsub가 빠져있을 겁니다.거의 URI.escape만큼 심각할 수 있지만 오래된 오류를 제공하지는 않습니다.

class XXX
      def self.encode(path)
        path, query = path.split("?", 2)
        return path if query.nil?
        query = CGI.escape(query).gsub("%3A", ":").gsub("%3D","=").gsub("%5B","[").gsub("%5D","]").gsub("%2C",",").gsub("+","%20")
        return [path,query].join("?")
      end
end

XXX.encode("http://test.com/some/path?query=[box: \"cart\"]")
URI.encode("http://test.com/some/path?query=[box: \"cart\"]")

두 출력 모두:

=> "http://test.com/some/path?query=[상자:%20%22카트%22]"
=> "http://test.com/some/path?query=[상자:%20%22카트%22]"

언급URL : https://stackoverflow.com/questions/2824126/whats-the-difference-between-uri-escape-and-cgi-escape