【问题标题】:How to write malformed HTTP response to "guarantee" something akin to HTTP 500如何编写格式错误的 HTTP 响应以“保证”类似于 HTTP 500 的内容
【发布时间】:2018-10-22 06:47:18
【问题描述】:

假设我开始写入响应正文,但出现了一些错误,我需要指出它是 HTTP 500,即使 HTTP 200 OK 标头已被写入标头... 如何在响应正文中写入一些保证格式错误的内容,以便客户端将响应解释为某种错误?

【问题讨论】:

    标签: http http-headers httpresponse


    【解决方案1】:

    一般来说,这是不可能的。有些客户端只关心响应头,可能不再关注您在响应头之后发送的内容。

    但对于某些客户,在某些情况下,这是可能的。

    我在这里假设HTTP/1.1HTTP/2 可能会提供更多机会,因为协议中还有更多要搞砸的地方,而且实现通常更严格。相反,HTTP/1.0 更加笨拙和宽松,因此更难破解。

    1. 在响应结束之前关闭连接,如您的framing 所示。如果您的响应带有Content-Length: 100,请在发送有效负载的第 100 个字节之前关闭。如果您的回复带有Transfer-Encoding: chunked,请在发送最后一个空块之前关闭。如果客户端希望接收整个有效负载,它可能 (and should) 将其视为错误。但有些不会,包括very popular client libraries

    2. 如果负载是结构化格式,如 JSON 或 XML,则执行与 1 相同的操作,但在关闭之前,发送会破坏该格式的内容。例如,任何有效的 JSON 文本都不能以 { 结尾。即使客户端没有将不完整的有效负载识别为错误,它也可能无法尝试解析它。

    3. 同1,但不是关闭连接,而是停止发送数据。客户端将“挂起”,直到其接收操作超时,它可能会将其视为错误。如果客户端是由没有为这种奢侈超时做好准备的人操作的,这可能是一个坏主意

    4. 仅适用于Transfer-Encoding: chunked:与​​ 3 相同,但不是挂起,而是发送伪造的非常长的块和/或无限期地继续发送块,直到客户端放弃或崩溃。可能是一个非常糟糕的主意,近乎恶意。

    【讨论】:

    • 在准系统 Node.js 服务器上使用普通套接字连接,如何关闭套接字?是socket.destroy()吗?
    猜你喜欢
    • 2018-12-20
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 2021-10-08
    • 2014-03-20
    • 2022-09-30
    • 2015-08-01
    • 2016-01-22
    相关资源
    最近更新 更多