Gunicorn 从 `transfer-coding` 中错误地删除了一些字符
作者: kenballus创建于 2025年3月20日更新于 2026年9月11日
标签Feature/HttpTo ReviewWaiting for feedback
当 Gunicorn 接收带有 Transfer-Encoding: \x0b\x0c\x1c\x1d\x1e\x1f\x85\xa0chunked\x0b\x0c\x1c\x1d\x1e\x1f\x85\xa0 头的请求时,它将其视为 Transfer-Encoding: chunked。这很有用,因为它是一个请求偷渡原语。您可以通过以下方式重现此行为:
- 启动一个 Gunicorn 服务器,该服务器回显请求体,例如 此服务器。
- 向其发送触发该错误的请求:
printf 'POST / HTTP/1.1\r\nHost: whatever\r\nTransfer-Encoding: \x0b\x0c\x1c\x1d\x1e\x1f\x85\xa0chunked\x0b\x0c\x1c\x1d\x1e\x1f\x85\xa0\r\n\r\n1\r\nZ\r\n0\r\n\r\n' \
| ncat localhost 80 \
| grep "body" \
| jq '.["body"]' \
| xargs echo \
| base64 -d \
| xxd- 观察消息体被解释为分块的情况:
00000000: 5a Z内容来源: benoitc/gunicorn