如果(向客户端)传输的数据多于 Content-Length 会怎样?

What happens if more data than the Content-Length is transferred (to the client)?

我正在一个服务器上工作,该服务器接受来自用户的 URL 并下载它(并对其执行其他操作,例如将其上传回来,但这与此处无关)。它应该接受的最大文件大小是 4 GB,这就是为什么用户提供的 URL 必须存在 Content-Length 的原因。

但是,如果假设恶意服务器给出了 2 GB 的 Content-Length,而最终传输的是 6 GB,会发生什么情况?是否有适当的机制来阻止这种情况?我正在使用 Rust 库 reqwest,但其他 HTTP 客户端的答案也很棒。

一个常见的实现将只获取 Content-length 并读取指定数量的数据 - 将剩余数据留在套接字缓冲区(或者可能是某些用户 space 缓冲区)。因此它可能适用于此特定请求。

但这实际上可能会在 HTTP 持久连接的情况下造成问题。对于 Content-length 太短的请求,剩余数据将被解释为同一连接上的另一个 HTTP 请求。对于具有类似问题的响应,剩余数据将被解释为对连接上下一个请求的响应。在最好的情况下,这将被视为由于格式错误的数据而导致的错误,并且请求将被放弃。在最坏的情况下,它可能会导致安全问题 - 另请参阅 HTTP 请求和响应拆分作为相关攻击。

... which is why the Content-Length MUST exist for the URL

请注意,Content-length 在请求或响应中实际上不是必需的。消息 header 可能没有指示响应的最终大小,因为它可能使用 Transfer-Encoding: chunked 或者只是以关闭 TCP 连接结束。