奇数重定向位置会导致urllib2出现代理错误

时间:2012-11-14 00:58:10

标签: python urllib2

我使用urllib2使用Python 2.7.3进行http post请求。我的请求是返回HTTPError异常(HTTP错误502:代理错误)。

查看与Charles的消息流量,我发现以下情况正在发生:

  1. 我使用urllib2发送HTTP请求(POST /index.asp?action=login HTTP / 1.1)
  2. 远程服务器回复状态303和位置标题../ index.asp?action = news
  3. urllib2重试发送获取请求:(GET /../index.asp?action=news HTTP / 1.1)
  4. 远程服务器回复状态502(代理错误)
  5. 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请求,但请求产生相同的结果。当然,这可能是因为请求建立在urllib2上。

    感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

与302一起发送的位置在多方面是错误的。

首先,如果您阅读RFC2616(HTTP / 1.1标头字段定义)14.30位置,则位置必须是absoluteURI,而不是相对的。第10.3.3节明确指出这是相关的定义。

其次,即使允许相对URI,RFC 1808,相对统一资源定位器,4。解析相对URL,步骤6,仅指定模式中..的特殊处理<segment>/../ }。这意味着相对网址不应以..开头。因此,即使基本网址为http://example.com/foo/bar/且相对网址为../baz/,解析后的网址也不是http://example.com/foo/baz/,而是http://example.com/foo/bar/../baz。 (当然,大多数服务器都会以相同的方式对待这些服务器,但这取决于每台服务器。)

最后,即使您在解析..之前合并了相对URL和基本网址,但路径以..开头的绝对URI也无效。

因此,该错误在服务器的配置中。

现在,碰巧很多用户代理都会解决这个问题。特别是,他们将/../foo转换为/foo,以阻止用户(或代表他们在他们不知情的情况下运行的任意JS)试图“逃避webroot”攻击。

但这并不意味着urllib2应该这样做,或者说没有这样做是错误的。当然urllib2应该更早地检测到错误,这样它就可以告诉你“无效路径”或者其他东西,而不是一起运行一个非法的绝对URI,它会混淆服务器发回你的无意义错误。但 是失败的权利。

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

使用urllib2执行此操作的方法是为您自己的HTTPRedirectHandler提供redirect_request方法的实现,该方法可识别此情况并返回与默认值不同的Request代码会(特别是http://example.com/index.asp?action=news代替http://example.com/../index.asp?action=news)。