我正在一个服务器上工作,它接受来自用户的 URL 并下载它(并对它做其他事情,比如将它上传回来,但这在这里无关紧要)。它应该接受的最大文件大小为 4 GB,这就是用户提供的 URL 必须存在 Content-Length 的原因。
但是,如果恶意服务器给出的 Content-Length 为 2 GB,而最终传输 6 GB 会怎样?是否有适当的机制来阻止这种情况?我正在使用 Rust 库 reqwest,但其他 HTTP 客户端的答案也会很棒。
我正在一个服务器上工作,它接受来自用户的 URL 并下载它(并对它做其他事情,比如将它上传回来,但这在这里无关紧要)。它应该接受的最大文件大小为 4 GB,这就是用户提供的 URL 必须存在 Content-Length 的原因。
但是,如果恶意服务器给出的 Content-Length 为 2 GB,而最终传输 6 GB 会怎样?是否有适当的机制来阻止这种情况?我正在使用 Rust 库 reqwest,但其他 HTTP 客户端的答案也会很棒。
一个常见的实现将只获取Content-length
并读取指定的数据 - 将剩余数据留在套接字缓冲区(或者可能是一些用户空间缓冲区)中。因此它可能适用于这个特定的请求。
但这实际上可能会在 HTTP 持久连接的情况下造成麻烦。对于太短的请求,Content-length
剩余数据将被解释为同一连接上的另一个 HTTP 请求。对于具有类似问题的响应,剩余数据将被解释为对连接上下一个请求的响应。在最好的情况下,由于数据格式错误,这将被视为错误,请求将被放弃。但在最坏的情况下,它可能会导致安全问题 - 另请参阅 HTTP 请求和响应拆分作为相关攻击。
...这就是为什么 URL 必须存在 Content-Length
请注意,Content-length
请求或响应中实际上并不需要。消息标头可能没有指示响应的最终大小,因为它可能使用Transfer-Encoding: chunked
TCP 连接或仅以关闭 TCP 连接结束。