【问题标题】:HTTP: Can I trust 'Content-Length' request header valueHTTP:我可以信任“内容长度”请求标头值吗
【发布时间】:2026-02-15 04:00:02
【问题描述】:

我正在开发文件上传服务。我希望限制我的用户上传文件的总大小,即他们有上传文件的配额。 所以我想在用户开始上传新文件时检查可用配额。 最简单的方法是获取 POST 请求的“Content-Length”标头值,并根据剩余用户的配额检查它。 但我很担心我是否可以信任“内容长度”的价值。 如果一个坏人在“Content-Length”标头中指定一个小值并开始上传一个大文件怎么办。

我应该在从输入流读取(并将文件保存在磁盘上)时额外检查还是冗余(Web 服务器应该检测到这种情况)?

【问题讨论】:

    标签: http file-upload


    【解决方案1】:

    简短的回答:它是安全的

    长答案:通常,服务器需要读取(最多)与Content-Length 请求标头中指定的字节数一样多的字节。之后出现的任何字节都应表示一个全新的请求(重用相同的连接)。

    我假设通过检查接下来的几个字节是否可以解析为请求行来在服务器上验证此要求。

    request-line = method SP request-target SP HTTP-version CRLF
    

    如果你的坏人不够聪明,无法在消息正文的正确位置注入请求标头,服务器应该(必须?)自动将整个请求链视为无效并中止文件上传。

    如果您的人确实在消息正文中注入了新的请求标头(也称为请求走私),则每个生成的请求在技术上仍然有效,您仍然可以相信 Content-Length 是对每个消息体有效。你只需要注意不同类型的攻击。例如:您可能安装了过滤传入请求的代理,但仅通过检查第一个请求的标头来实现。走私的请求获得免费通行证,这是明显的安全漏洞。

    【讨论】: