http - 如果(向客户端)传输的数据量超过了Content-Length,会发生什么情况?

标签 http rust content-length reqwest

我正在服务器上接受用户的URL并下载它(并对其进行其他操作,例如将其上传回,但这在这里无关紧要)。它应接受的最大文件大小为4 GB,这就是为什么用户提供的URL必须存在Content-Length的原因。
但是,如果说一个恶意服务器给出了2 GB的内容长度,而最终却转移了6 GB,那会发生什么呢?是否有制止这种情况的机制?我正在使用Rust库reqwest,但其他HTTP客户端的答案也将是不错的。

最佳答案

常见的实现方式是仅使用Content-length并读取指定的数据量-将其余数据保留在套接字缓冲区(或某些用户空间缓冲区)中。因此,它可能适用于此特定请求。
但这实际上可能在HTTP持久连接的情况下引起麻烦。对于Content-length太短的请求,其余数据将被解释为同一连接上的另一个HTTP请求。对于具有类似问题的响应,剩余数据将被解释为对连接上下一个请求的响应。在最佳情况下,由于数据格式错误,这将被视为错误,并且该请求将被放弃。在最坏的情况下,它可能会导致安全问题-另请参阅HTTP请求和响应拆分作为相关攻击。

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


请注意,请求或响应中实际上并不需要Content-length。消息头可能没有响应的最终大小的指示,因为它可能使用Transfer-Encoding: chunked或仅以TCP连接的结尾结束。

关于http - 如果(向客户端)传输的数据量超过了Content-Length,会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65559005/

相关文章:

PHP不会在cmd中执行代码

indexing - 切片索引在 Rust 中如何工作?

performance - Content-Length header 与分块编码

php - 内容长度 header 设置不正确

python - 用于分块响应的 uwsgi/nginx 配置

javascript - Webkit JavaScript 可以 PUT 或 POST 图像 REST 样式作为纯二进制文件吗?

http - 用 lighttpd 重写 - 如何删除文件扩展名

sorting - 如何在 Rust 中对向量进行排序?

rust - 如何在枚举项之间移动非复制数据

performance - Firebug net 选项卡报告的页面接收时间长(页面加载缓慢)