能否用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
相关产品推荐
相关产品推荐

