gpt4 book ai didi

python - 奇怪的重定向位置导致 urllib2 出现代理错误

转载 作者:太空宇宙 更新时间:2023-11-03 11:33:02 24 4
gpt4 key购买 nike

我正在使用 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 的位置 header
  3. urllib2 重试发送获取请求:(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 错误,我用 requests 换掉了 urllib2,但 requests 产生了相同的结果。当然,这可能是因为 requests 是建立在 urllib2 之上的。

感谢您的帮助。

最佳答案

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

首先,如果您阅读 RFC2616 (HTTP/1.1 Header Field Definitions) 14.30 Location,Location 必须是一个绝对的URI,而不是一个相对的URI。并且10.3.3节明确了这是相关的定义。

其次,即使允许相对 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,其路径以 .. 开头无效。

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

现在,碰巧许多用户代理会解决这个错误。特别是,他们转/../foo进入/foo阻止用户(或在他们不知情的情况下代表他们运行的任意 JS)尝试进行“逃离 webroot”攻击。

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

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

urllib2 做到这一点的方法就是自备 HTTPRedirectHandler 实现 redirect_request识别这种情况并返回不同的 Request 的方法比默认代码(特别是 http://example.com/index.asp?action=news 而不是 http://example.com/../index.asp?action=news )。

关于python - 奇怪的重定向位置导致 urllib2 出现代理错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13371534/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com