2012-11-14 2 views
4

urllib2를 사용하여 Python 2.7.3을 사용하여 http 게시 요청을하고 있습니다. 내 요청에 HTTPError 예외가 반환됩니다 (HTTP 오류 502 : 프록시 오류). 찰스와 메시지 트래픽을 보면 이상한 리디렉션 위치로 인해 urllib2에서 프록시 오류가 발생합니다.

, 나는 다음을 참조 일어나고있다 :
  1. 내가
  2. 을 urllib2를 사용 (HTTP/1.1을 /index.asp?action=login POST)에 HTTP 요청을 보내 원격 서버가 상태 303과 위치 헤더로 답장합니다 ../index.asp?action=news
  3. urllib2는 get 요청을 다시 전송합니다. (GET /../index.asp?action=news HTTP/1.1)
  4. 원격 서버가 상태 502 (프록시 오류)로 응답 함
  5. "DNS 조회 실패가 : 10.0.0.30:80index.asp"0

502 응답은 응답 본문이 포함되어 의미하는 (조작 된 URL을 주목하라)

그래서 나는이을하는 프록시 서버에 원격 서버의 네트워크가 요청에 "/../index.asp"URL을보고 잘못된 URL로 요청을 전송하여 잘못 해석합니다.

브라우저 (Chrome)에서 동일한 요청을하면 재 시도가 GET /index.asp?action=news로 전송됩니다. 따라서 Chrome은 URL에서 "/ .."을 제거하고 원격 서버는 유효한 응답으로 응답합니다.

이것은 urllib2 버그입니까? 재 시도가 URL의 "/ .."을 무시하도록 할 수있는 것이 있습니까? 아니면이 문제를 해결할 다른 방법이 있습니까? 그것이 urllib2 버그일지도 모른다고 생각하면서 urllib2를 요청으로 바꾸었지만 요청은 동일한 결과를 만들어 냈습니다. 물론 요청이 urllib2에서 작성되기 때문일 수 있습니다.

도움 주셔서 감사합니다.

+0

Chrome에서 시도 할 때 위치 헤더는'../ index.asp? action = news'입니까? –

+0

나는 이것이 잘못된 위치라고 믿습니다.이 경우 서버 구성의 버그입니다. 그렇다면 크롬과 다른 많은 브라우저가이 버그를 해결한다고해서 urllib2가 버그가 없다는 것을 의미하지는 않습니다. – abarnert

답변

2

해당 302와 함께 전송되는 위치는 여러 가지면에서 잘못되었습니다.

첫 번째로 RFC2616 (HTTP/1.1 헤더 필드 정의)을 읽는다면 14.30 위치는 상대방이 아닌 절대 URI이어야합니다. 그리고 10.3.3 절은 이것이 관련된 정의라는 것을 분명히합니다. 상대 URI 허용하더라도 제

, RFC 1808 상대 유니폼 리소스 로케이터 해결 4. 상대 URL, 단계 6 만 패턴 <segment>/../..에 대해 특별한 처리를 지정한다. 즉, 상대 URL은 ..으로 시작하면 안됩니다. 따라서 기본 URL이 http://example.com/foo/bar/이고 상대 URL이 ../baz/ 인 경우에도 확인 된 URL은 http://example.com/foo/baz/이 아니라 http://example.com/foo/bar/../baz이됩니다. (물론 대부분의 서버는 동일한 방식으로 처리되지만 각 서버에 따라 다릅니다.) ..을 해결하기 전에 상대 URL과 기본 URL을 결합 했더라도 ..으로 시작하는 경로의 절대 URI는 다음과 같습니다. 유효하지 않습니다.

그래서 버그는 서버 구성에 있습니다.

이제 많은 사용자 에이전트가이 버그를 해결할 수 있습니다. 특히 그들은 /../foo/foo으로 설정하여 사용자 또는 지식이없는 임의의 JS가 "웹 루트에서 탈출"공격을 시도하는 것을 차단합니다.

그러나 그렇다고해서 urllib2이 그렇게해야하는 것은 아니며 그렇지 않은 경우 버그가 있음을 의미하지는 않습니다. 물론 urllib2은 잘못 된 경로를 알려주거나 무언가를 말할 수 있도록 오류를 먼저 감지해야합니다. 불법적 인 절대 URI를 함께 실행하면 서버가 말도 안되는 오류를 다시 보내 게됩니다. 하지만 입니다.

서버 구성이 잘못되었다고 말하는 것이 좋지만 서버를 담당하지 않는 한 자신의 사이트가 고장났다는 것을 확신시키려는 힘든 전투에 직면하게 될 것입니다. 관심있는 모든 웹 브라우저에서 작동 할 때 수정 될 수 있습니다. 즉, 자신의 사이트를 처리하기 위해 자신 만의 해결 방법을 작성해야 할 수도 있습니다.

방법은해야 할 일이 urllib2은이 사건을 인식하고 것 (특히, 대신 http://example.com/../index.asp?action=newshttp://example.com/index.asp?action=news) 기본 코드와 다른 Request을 반환 redirect_request 메소드의 구현과 HTTPRedirectHandler 자신을 공급하는 것입니다 함께.

+0

와우. 훌륭한 설명 - 철저하고 명확합니다. HTTPRedirectHandler를 살펴볼 것이다. – david193

+0

abamert, 도움 주셔서 감사합니다. 나는 HTTPRedirectHandler를 구현했고, 내가 필요한 것을 내게 주었다. – david193

+0

@ david193 : 도와 줘서 기쁩니다. 한편 원격 서버를 실행중인 사람이라면 누구나이 파일을 처리해야합니다. – abarnert

관련 문제