我正在开发文件上传服务。我希望我的用户受限于总上传文件大小,即他们有上传文件的配额。 所以我想在用户开始上传新文件时检查可用配额。 最简单的方法是获取POST请求的“Content-Length”标头值,并根据剩余用户的配额进行检查。 但我担心我是否可以信任'内容长度'的价值。 如果坏人在“Content-Length”标题中指定一个小值并开始上传一个巨大的文件,该怎么办?
我应该在从输入流读取期间另外检查(并在磁盘上保存文件)或者它是多余的(Web服务器应该检测到这种情况)?
答案 0 :(得分:4)
简短回答:这是安全的
答案很长:通常,服务器需要(最多)读取Content-Length
请求标头中指定的字节数。之后的任何字节都应指示一个全新的请求(重用相同的连接)。
我假设通过检查接下来的几个字节是否可以解析为请求行来验证服务器上的此要求。
request-line = method SP request-target SP HTTP-version CRLF
如果您的坏人不够聪明,无法在邮件正文的正确位置注入请求标头,那么服务器应该(必须?)自动将整个请求链视为无效并中止文件上传。
如果您的人 在邮件正文中注入了新的请求标头(也就是请求走私),那么每个结果请求在技术上仍然有效,您仍然可以信任{{1} }对每个邮件正文都有效。你只需要注意不同类型的攻击。例如:您可能安装了一个过滤传入请求的代理,但只能通过检查第一个请求的标头来实现。走私请求获得免费通行证,这是一个明显的安全漏洞。