【问题标题】:Odd redirect location causes proxy error with urllib2奇怪的重定向位置导致 urllib2 出现代理错误
【发布时间】:2012-11-14 00:58:09
【问题描述】:

我正在使用 urllib2 使用 Python 2.7.3 执行 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 回复在响应正文中包含以下内容:“DNS 查找失败:10.0.0.30:80index.asp”(注意格式错误的 URL)

所以我认为这意味着远程服务器网络上的代理服务器在请求中看到“/../index.asp” URL 并对其进行了误解,从而使用错误的 URL 发送我的请求。

当我使用浏览器 (Chrome) 发出相同请求时,重试将发送到 GET /index.asp?action=news。因此 Chrome 会从 URL 中去掉前导的“/..”,远程服务器会回复一个有效的响应。

这是一个 urllib2 错误吗?有什么办法可以让重试忽略 URL 中的“/..”吗?或者有没有其他方法可以解决这个问题?认为这可能是一个 urllib2 错误,我用请求替换了 urllib2,但请求产生了相同的结果。当然,这可能是因为 requests 是建立在 urllib2 之上的。

感谢您的帮助。

【问题讨论】:

  • 当您在 Chrome 中尝试时,位置标头是否也是 ../index.asp?action=news
  • 我相信这是一个无效的位置,在这种情况下,它确实是服务器配置中的一个错误。如果是这样,Chrome 和许多其他浏览器可以解决此错误这一事实并不意味着 urllib2 不这样做是错误的。

标签: python urllib2


【解决方案1】:

使用该 302 发送的位置在多个方面都是错误的。

首先,如果您阅读RFC2616(HTTP/1.1 标头字段定义)14.30 Location,则 Location 必须是绝对URI,而不是相对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)尝试进行“逃避webroot”攻击。

但这并不意味着urllib2 应该这样做,或者不这样做是错误的。当然urllib2 应该更早地检测到错误,以便它可以告诉您“无效路径”或其他内容,而不是一起运行一个非法的绝对 URI,这会混淆服务器向您发送无意义的错误。但失败正确的。

说服务器配置错误固然很好,但除非您是服务器的负责人,否则您可能会面临一场艰苦的战斗,试图让他们相信他们的网站已损坏并且需要当它适用于他们关心的每个网络浏览器时,它就会被修复。这意味着您可能需要编写自己的解决方法来处理他们的网站。

使用urllib2 的方法是为您自己的HTTPRedirectHandler 提供一个redirect_request 方法的实现,该方法可以识别这种情况并返回与默认代码不同的Request(特别是@987654341 @ 而不是 http://example.com/../index.asp?action=news)。

【讨论】:

  • 哇。一个很好的解释——彻底而清晰。我将研究 HTTPRedirectHandler。
  • abamert,感谢您的帮助。我实现了一个 HTTPRedirectHandler,它给了我我需要的东西。
  • @david193:很高兴为您提供帮助。同时,向运行远程服务器的任何人提交一个错误,因为你不应该首先处理这个问题……
猜你喜欢
  • 2018-02-17
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 2022-12-19
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
相关资源
最近更新 更多