过去那种认为 Python 对 CONNECT 一律发送 HTTP/1.0 的说法,已不再是安全的通则。Python 3.12 将 http.client 的隧道行为改为 HTTP/1.1,并在未提供 Host 头时增加了自动生成。

这一变更属于有文档记载的标准库实现。更高层的 HTTP 库可能覆盖或包装隧道行为,因此既要记录它的版本,也要记录 Python 的版本。

如果代理拒绝隧道,请检查该客户端实际产生的 CONNECT 交互。修改目标请求的 HTTP 版本,或给网站请求添加 Host 头,并不一定会改变更早的那次隧道请求。

同样,在旧的 Requests 适配器示例中修改私有字段,可能把应用锁死在过时的内部 API 上。应优先选择兼容且受支持的客户端与运行时组合,以及有文档记载的代理集成方式。

在报告中把两段会话分开:用于打开隧道的 HTTP 请求,以及随后在隧道内与目标协商的协议。两者可以使用不同版本,并在不同阶段失败。

相关文章