【问题标题】:can an http client lie about a request's content-length?http 客户端可以对请求的内容长度撒谎吗?
【发布时间】:2013-10-19 19:19:11
【问题描述】:

具体来说,我是从 node.js 服务器的角度来讨论的。很难在 node.js 中对此进行测试,因为http.client 验证了content-length

客户是否可以谎报正文的内容长度,至少在正文达到http.createServer().on('request') 时?

  • 客户端能否发送大于content-length 的正文?我认为这是不可能的,因为它很可能在解析器级别进行检查,但我想要证明。
  • 客户端可以发送小于content-length 的正文吗?我认为这可能是真的。

我担心可能不使用行为良好的 http 客户端的恶意用户。

【问题讨论】:

  • 是的。 http.client 对其进行验证,因此它甚至永远不会到达服务器。我不知道非 node.js 客户端是如何工作的。

标签: node.js http


【解决方案1】:

当然可以。您可以简单地打开一个 TCP 套接字连接到 Web 服务器正在运行的任何 IP/端口,并在那里编写您想要的任何内容。当然,表现良好的客户不会这样做,但没有什么能阻止客户这样做。

但是,这往往是您在服务器问题上使用的任何 HTTP 堆栈,在本例中为节点。它需要 1)不要盲目地读入(巨大的)内容长度字节,因为这可能会使服务器严重崩溃;2)确保(对于合理大小的请求)客户端没有撒谎。

在节点的情况下,它在此处可见:https://github.com/joyent/node/blob/master/deps/http_parser/http_parser.c#L1471

试试看吧;-)

【讨论】:

  • 据我所知,是的。
【解决方案2】:

视情况而定
当然,您可以发送 wring 内容长度,问题是客户端如何处理它。
有脚本或服务器客户端可能会尝试下载您的内容并完全搞砸。
大多数浏览器似乎都实现了一些容错行为,但是有许多不同的实现。
我记得有一个旧的即保持插座打开从不关闭它。这最终导致了一个永无止境的页面加载。
一些网景浏览器似乎完全依赖于正确的内容长度。
一个好主意是离开内容长度。这应该适用于所有浏览器。

【讨论】:

    猜你喜欢
    • 2014-08-07
    • 2018-04-18
    • 2020-02-25
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    相关资源
    最近更新 更多