【问题标题】:Does node's http server have any Content-Length verification for the ReadableStream request节点的 http 服务器是否对 ReadableStream 请求进行任何 Content-Length 验证
【发布时间】:2015-02-23 10:05:31
【问题描述】:

Node.js 的 http 服务器在请求上实现了 ReadableStream。

我知道我需要自己检查 Content-Length 以决定是否要接受这么长的请求。

但是节点是否会对 ReadableStream 进行任何验证以确保其有效?

A) 如果客户端提前关闭连接并且 Node 没有收到足够的数据来满足 Content-Length,它会 end 流并假装它没问题还是会发出错误?

B) 如果客户端发送的数据多于 Content-Length 所说的,Node 会发出错误并停止传输数据,还是继续传输超出长度的数据?

我正在通过 XHR2 实现简单的 POST 正文上传,我想知道我是否必须编写自定义转换流来自己验证流(所以有人不能说他们正在上传 2KB,但实际上上传的是 20GB写入磁盘)。

【问题讨论】:

    标签: node.js http content-length


    【解决方案1】:

    回答我自己的问题,因为我不得不尝试对测试脚本进行测试攻击。

    节点确实正确处理了 http 请求流。

    在将 req 管道传输到文件时的正常请求中:

    • end 事件将直接在 req 上触发
    • close 事件将在可写流上触发

    当你尝试写超出 Content-Length 时:

    • req 会将 Content-Length 定义的数据量通过管道传输到文件中
    • end 事件将直接在 req 上触发
    • close 事件将在可写流上触发

    当您尝试欠写然后关闭连接时:

    • close 事件将直接在 req 上触发
    • 不会在可写流上触发任何事件(我认为这意味着您应该将其视为中止并自行关闭和取消链接文件)

    因此,在您验证 Content-Length 可接受之后将 req 管道传输到文件是安全的。当 Content-Length 为 2KB 时,节点不会将 20GB 的数据写入磁盘。

    【讨论】:

      猜你喜欢
      • 2015-04-23
      • 1970-01-01
      • 2015-08-20
      • 2015-03-05
      • 2020-01-29
      • 2016-04-04
      • 2021-11-28
      • 2023-03-30
      • 2013-01-27
      相关资源
      最近更新 更多