You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否用Python Requests发送含冲突Content-Length与Transfer-Encoding的请求?

关于Python Requests库发送请求走私特殊HTTP请求的问题

我在学习Web攻击、完成请求走私实验时,需要编写Python脚本发送同时包含不一致Content-Length和Transfer-Encoding头的特殊HTTP请求,但使用Requests库时遇到了请求被自动修改的问题,具体情况如下:

基础未修改请求可正常工作

代码示例:

with requests.Session() as client:
    client.verify = False
    client.proxies = proxies
[...]
    data = '0\r\n\r\nX'
    req = requests.Request('POST', host, data=data)
    prep = client.prepare_request(req)
    client.send(prep)

实际发送的请求内容:

[...]
Content-Length: 6\r\n
\r\n
0\r\n
\r\n
X

添加Transfer-Encoding头后请求被自动篡改

尝试手动添加Transfer-Encoding头的代码:

data = '0\r\n\r\nX'
req = requests.Request('POST', host, data=data)
prep = client.prepare_request(req)
prep.headers['Transfer-Encoding'] = 'chunked'
client.send(prep)

实际发送的请求变成了:

[...]
Content-Length: 0\r\n
\r\n

而我预期的请求应该是:

[...]
Content-Length: 6\r\n
Transfer-Encoding: chunked\r\n
\r\n
0\r\n
\r\n
X

先准备分块请求再添加Content-Length头同样失败

换一种方式,先通过生成器构造分块请求,再添加Content-Length头:

def gen():
    yield b'0\r\n'
    yield b'\r\n'
    yield b'X'

req = requests.Request('POST', host, data=gen())
prep = client.prepare_request(req)
prep.headers['Content-Length'] = '6'
client.send(prep)

此时Transfer-Encoding头被完全移除,数据按分块规则重新解析,Content-Length也被自动重算并匹配新内容。

我原本以为在准备请求后修改内容就能发送自定义的特殊请求,现在想知道这个需求是否可以通过Requests库实现,还是必须使用更低层的库来发送任意格式的HTTP数据?

内容的提问来源于stack exchange,提问作者fleitner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 00:30:52