【问题标题】:HTTP validation: Combining multiple headersHTTP 验证:组合多个标头
【发布时间】:2017-02-25 19:46:07
【问题描述】:

HTTP/1.1 规范对具有多个头字段的请求定义如下:

发件人不得生成具有相同字段的多个标头字段 消息中的名称,除非该名称的整个字段值 标头字段被定义为一个逗号分隔的列表 [即,#(values)] 或者标头字段是一个众所周知的例外(如下所述)。

收件人可以将多个标题字段与同一字段组合 名称转换为一个“字段名称:字段值”对,而不更改 消息的语义,通过将每个后续字段值附加到 按顺序组合的字段值,以逗号分隔。命令 其中接收到的具有相同字段名称的头字段是 因此对组合场的解释很重要 价值;代理不得更改这些字段值的顺序 转发消息。

用于解析请求:

  • 是否需要先合并标头(以逗号分隔),然后验证合并的标头?

  • 在将它们合并为一个标头之前,是否需要分别验证每个标头?

  • 这是未定义的,我可以选择我喜欢的任何选项吗?

这会产生影响的一个例子是:

GET / HTTP/1.1
Host: 127.0.0.1
Upgrade: foo
Upgrade: 
Upgrade: bar

这里,第二个单独的标头本身是无效的(因为升级标头需要至少 1 个协议)。但是,所有三个标头的组合变为foo,,bar,这是允许的。

当规范说它需要至少 1 项时:这是针对完整的组合标头,还是单独针对每个标头?

【问题讨论】:

  • 你说“foo,,bar这是允许的”; Upgrade 采用逗号分隔的标记,中间的空字符串不是有效标记。你能澄清什么会允许这样做吗?否则,您提供的两种形式均无效。
  • 规范说“发件人不得生成空列表元素”,但建议服务器可以容忍这种(并不少见)错误。对于验证,而不是真实世界的服务器,我希望解析的容忍度较低。
  • @Joe:这是关于服务器端的,规范明确列出了允许使用空列表元素的类似示例,只要它们不计入元素总数。
  • (这与客户端的规范一致性无关——我正在构建服务器端并想检查什么是好的,什么应该给出 400)

标签: validation http parsing http-headers


【解决方案1】:

它用于完全组合的标题字段。因此,必须接受没有字段值的单个“升级:”(尽管发送是非法的)。

【讨论】:

  • 我澄清了我的回答:空值必须被收件人接受(出于历史原因),但不得发送。来源:greenbytes.de/tech/webdav/rfc7230.html#abnf.extension加上常识...
  • In contrast, the following values would be invalid, since at least one non-empty element is required by the example-list production: "" – 如果是完全组合的标头字段,则可以接受。如果是每个标头字段,则会被拒绝。这也是我在问题中所说的^^如果是组合字段,也可以发送(must not [...] unless either the entire field value for that header field is defined as a comma-separated list [i.e., #(values)]
  • 源问题是关于“它适用于完全组合的标题字段”。规范中的其余部分很清楚。
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 2016-01-28
  • 2021-11-01
  • 1970-01-01
  • 2016-05-09
  • 1970-01-01
  • 2011-04-15
  • 2021-12-24
相关资源
最近更新 更多