4

Python 2.7.3 を使用して、urllib2 を使用して http 投稿要求を実行しています。リクエストが HTTPError 例外を返しています (HTTP エラー 502: プロキシ エラー)。

Charles のメッセージ トラフィックを見ると、次のことが起こっていることがわかります。

  1. urllib2 を使用して HTTP 要求 (POST /index.asp?action=login HTTP/1.1) を送信します。
  2. リモート サーバーは、ステータス 303 とロケーション ヘッダー ../index.asp?action=news で応答します。
  3. urllib2 は get リクエストの送信を再試行します: (GET /../index.asp?action=news HTTP/1.1)
  4. リモート サーバーはステータス 502 (プロキシ エラー) で応答します。

502 応答には、応答本文に次のものが含まれます。

したがって、これは、リモート サーバーのネットワーク上のプロキシ サーバーが、要求内の "/../index.asp" URL を認識し、それを誤って解釈して、私の要求を不適切な URL で送信することを意味すると考えています。

ブラウザー (Chrome) で同じ要求を行うと、再試行は GET /index.asp?action=news に送信されます。したがって、Chrome は URL から先頭の「/..」を削除し、リモート サーバーは有効な応答を返します。

これは urllib2 のバグですか? 再試行で URL の「/..」が無視されるようにできることはありますか? または、この問題を解決する他の方法はありますか? urllib2 のバグかもしれないと考えて、urllib2 をリクエストと交換しましたが、リクエストは同じ結果をもたらしました。もちろん、それはリクエストが urllib2 で構築されているためかもしれません。

助けてくれてありがとう。

4

1 に答える 1

2

その 302 で送信されている場所は、複数の点で間違っています。

まず、RFC2616 (HTTP/1.1 Header Field Definitions) 14.30 Location を読むと、Location は相対 URI ではなく絶対 URI でなければなりません。そして、セクション 10.3.3 は、これが関連する定義であることを明確にしています。

第 2 に、相対 URI が許可されていたとしても、RFC 1808の Relative Uniform Resource Locators, 4. Resolving Relative URLs, step 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..は無効です。

したがって、バグはサーバーの構成にあります。

さて、たまたま多くのユーザー エージェントがこのバグを回避します。特に、ユーザー (または知らないうちに実行されている任意の JS) が「webroot からの脱出」攻撃を試みるのをブロックします/../foo/foo

しかし、それはurllib2そうすべきだという意味でも、そうしないからといってバグがあるという意味でもありません。もちろんurllib2、サーバーを混乱させて無意味なエラーを送り返す違法な絶対URIを一緒に実行する代わりに、「無効なパス」などを伝えることができるように、エラーを早期に検出する必要があります。しかし、失敗するのは正しい。

サーバーの構成が間違っていると言っても過言ではありませんが、あなたがサーバーの責任者でない限り、サイトが壊れていて修正する必要があることを彼らに納得させるのはおそらく困難な戦いに直面するでしょう.関心のあるすべての Web ブラウザーで動作します。つまり、サイトに対処するために独自の回避策を作成する必要がある場合があります.

これを行う方法は、このケースを認識し、デフォルト コードとは異なる (特に の代わりに)を返す methodの実装をurllib2独自に提供することです。HTTPRedirectHandlerredirect_requestRequesthttp://example.com/index.asp?action=newshttp://example.com/../index.asp?action=news

于 2012-11-14T01:30:54.777 に答える