문제

내 URL의 일부인 '= &?/;#+%'와 같은 문자열이 있다고 가정 해 봅시다.

example.com/servletPath/someOtherPath/myString/something.html?a=b&c=d#asdf

여기서 mystring은 위의 문자열입니다. 중요 부분을 인코딩하여 URL이 모양처럼 보입니다

example.com/servletPath/someOtherPath/%3D%26%3F%2F%3B%23%2B%25/something.html?a=b&c=d#asdf

여태까지는 그런대로 잘됐다.

내가 서블릿에 있고 어떤 것을 읽었을 때 request.getRequestURI(), request.getRequestURL() 또는 request.getPathInfo(), 반환 된 값은 이미 디코딩되어 있으므로

someOtherPath/=&?/;#+%/something.html?a=b&c=d#asdf

그리고 실제 특수 문자와 인코딩 된 캐릭터를 구별 할 수 없습니다.

나는이 상황에서 작동하는 Chars 위의 Chars를 금지함으로써 특정 문제를 해결했지만 서블릿 클래스에서 노고되지 않은 URL을 얻는 방법이 여전히 있는지 궁금합니다.

또 다른 편집 : 지난 저녁 에이 문제를 겪을 때 너무 피곤해서 실제로 무슨 일이 일어나고 있는지 알기에는 너무 피곤했습니다. 더 기괴한! 나는 서블릿에 맵핑되어 있습니다. 제외하고 경로에 %2F가있을 때. 이 경우 요청은 서블릿에 절대 적중하지 않습니다, 그리고 나는 404를 얻는다! %2f 대신 '/'를 넣으면 괜찮습니다. Linux에서 Java 1.6.0-04에서 Tomcat 6.0.14를 실행하고 있습니다.

도움이 되었습니까?

해결책

브라우저와 서버 모두에 대해 '%2f'와 '/'사이에는 근본적인 차이가 있습니다.

httpservletrequest 사양에 따르면 (논리없이, Afaict) :

  • getContextPath : 디코딩되지 않았습니다
  • getPathInfo : 디코딩
  • GetPathTranslated : 디코딩되지 않았습니다
  • GetQueryString : 디코딩되지 않았습니다
  • getRequesturi : 디코딩되지 않았습니다
  • getservletpath : 디코딩

getPathInfo ()의 결과 ~해야 한다 해독되지만 getRequesturi ()의 결과 안됩니다 디코딩됩니다. 그렇다면 서블릿 컨테이너가 사양을 깨뜨리고 있습니다 (Wouter Coekaerts와 Francois Gravel이 올바르게 지적). 어떤 Tomcat 버전을 실행하고 있습니까?

더 혼란스럽고 현재의 Tomcat 버전은 특정 특수 문자의 인코딩을 포함하는 경로를 거부합니다. 보안상의 이유로.

다른 팁

있다면 %2F 에서 디코딩 URL, 그것은 의미합니다 인코딩 URL이 포함되어 있습니다 %252F.

부터 %2F ~이다 / 그냥 나뉘 지 않는 이유는 무엇입니까? "\/" URL 인코딩에 대해 걱정하지 않습니까?

에 따르면 Javadoc, getRequesturi는 문자열을 해독해서는 안됩니다. 반면에 GetServletPath는 디코딩 된 문자열을 반환합니다. 나는 부두를 사용하여 로컬로 테스트했으며 문서에 설명 된대로 작동합니다.

따라서 당신이 묘사하는 행동이 태양 문서와 일치하지 않기 때문에 당신의 상황에서 다른 것이있을 수 있습니다.

당신이 쉬운 일을하려고하는 것 같습니다 (저지 사용). 원하는 데이터를 얻기 위해 URL의 선두 부분을 구문 분석 할 수 있습니까?

url.substring (startlength, url.length -endlength);

업데이트: 이 답변은 원래 경로에서 '/'및 '%2f'가 항상 동일하게 취급되어야한다고 잘못 언급 한 것입니다. 경로는 /-분리 된 세그먼트 목록이기 때문에 실제로 다릅니다.

인코딩 된 문자와 인코딩 된 문자 사이를 차이를 만들 필요는 없습니다. 경로 부분 URL의. 경로 안에는 URL에서 특별한 의미를 가질 수있는 문자가 없습니다. 예를 들어 '%2f'는 '/'와 동일하게 해석되어야하며, 이러한 URL에 액세스하는 브라우저는 적합하다고 생각되는대로 상대방으로 자유롭게 교체 할 수 있습니다. 그들 사이에 차이를 만드는 것은 URL이 인코딩되는 방식의 표준을 깨뜨리는 것입니다.

완전한 URL에서는 다음을 포함하여 다른 이유로 탈출 된 캐릭터와 비스카 핑 캐릭터간에 차이를 만들어야합니다.

  • 경로 부분이 어디에서 끝나는 지 확인합니다. 왜냐하면? 경로에서 인코딩 된 것은 끝으로 보이지 않아야합니다.
  • 쿼리 문자열 내부. 매개 변수의 값의 일부는 '&'또는 '=', ...
  • 경로 내부에서 '/'는 두 세그먼트를 분리하는 반면 '%2f'는 세그먼트 내에 포함 할 수 있습니다.

Java는 처음 두 가지 사례를 잘 처리합니다.

  • getPathInfo() 경로 부분 만 리코딩합니다
  • getParameter(String) 쿼리 부분의 일부에 액세스하려면

세 번째 사례를 잘 다루지 않습니다. 두 개의 경로 세그먼트의 분리로 '/'와 경로 세그먼트 내부 '/'(%2F) 사이의 차이를 만들려면 경로를 하나의 디코딩 된 문자열로 일관되게 표현할 수 없습니다. 하나의 인코딩 된 문자열 (예 : "foo/bar%2fbaz") 또는 디코딩 된 세그먼트 목록 (예 : "foo", "bar/baz")으로 표시 할 수 있습니다. 그러나 getPathInfo () API는 (하나의 디코딩 된 문자열) 수행 할 것을 약속하기 때문에 '/'및 '%2f'를 동일하게 처리 할 수밖에 없습니다.

일반적인 웹 응용 프로그램의 경우 괜찮습니다. 드문 경우에 실제로 차이를 만들어야하는 경우 URL의 구문 분석을 수행하여 RAW 버전을 얻을 수 있습니다. getRequestURI(). 당신이 주장하는대로 URL을 디코딩 한 경우, 당신이 사용하고있는 서블릿 구현에 버그가 있음을 의미합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top