是否可以在 HTTP 标头字段中包含多个 CRLF?

Posted

技术标签:

【中文标题】是否可以在 HTTP 标头字段中包含多个 CRLF?【英文标题】:Is it possible to include multiple CRLFs in a HTTP header-field? 【发布时间】:2015-09-23 02:08:38 【问题描述】:

以下是最新 HTTP RFC 7230 中的 HTTP 消息定义

 HTTP-message   = start-line
                  *( header-field CRLF )
                  CRLF
                  [ message-body ]

下面是header-field的定义,

 header-field   = field-name ":" OWS field-value OWS

 field-name     = token
 field-value    = *( field-content / obs-fold )
 field-content  = field-vchar [ 1*( SP / HTAB ) field-vchar ]
 field-vchar    = VCHAR / obs-text

 obs-fold       = CRLF 1*( SP / HTAB )

..和:

obs-text       = %x80-FF

..和ABNF's:

 VCHAR          =  %x21-7E
                                 ; visible (printing) characters

我们可以看到,field-value 可以有多个 obs-folds,而 obs-folds 有一个 CRLF。这对我来说很奇怪,因为我认为 CRLF 是标题行的结尾。是否有将多个 CRLF 编码到一个标头字段中的示例?还是我误解了定义?

【问题讨论】:

您是否尝试过在每个 CRLF 之前添加一个空格?单独的空行表示 HTTP 标头的结束。 我不练习什么。我只是对标头字段的 ABNF 定义是否正确感到困惑。 因此,您要问的是 HTTP 的 RFC 中是否存在错误——这是地球上使用最广泛和审查最广泛的信息传输协议之一。 是的。但是,我不确定这是一个错误还是我的误解。 @appleleaf,***.com/q/17463676/632951 的重复? 【参考方案1】:

您对标准的理解是正确的。过去,RFC 2616 下支持多行标题值。此功能被称为“折线”:

如果续行以空格或水平制表符开头,HTTP/1.1 标头字段值可以折叠到多行。所有线性空白,包括折叠,都具有与 SP 相同的语义。在解释字段值或向下游转发消息之前,接收者可以用单个 SP 替换任何线性空格。

所以下面两种形式是等价的:

Header: value1, value2

Header: value1,
        value2

较新的RFC 7230 明确弃用了这一点。实际上,“obs-fold”中的“obs”代表“过时”。

从历史上看,HTTP 标头字段值可以扩展到多个 通过在每个额外的行之前至少有一个空格或 水平制表符(obs 折叠)。本规范弃用了这样的行 折叠除了在 message/http 媒体类型中(第 8.3.1 节)。一种 发件人不得生成包含行折叠的消息(即, 具有包含与 obs-fold 规则匹配的任何字段值) 除非该消息用于在 message/http 中打包 媒体类型。

因此,尽管我在实践中从未见过此功能(或者至少没有注意到),但它确实存在。此外,似乎还没有完全弃用行折叠,HTTP 媒体类型标头仍然允许使用它。

php [arv]、Java 和 Go 等语言中的标准 HTTP 标头解析器仍支持多行标头。

我设法找到这样一个标题的唯一具体例子是在这个有这个图像的technet blog post 中:

注意Content-Type 标头中的黄色0d 0a(回车、换行)。

【讨论】:

@Malt,OP 正在询问“有没有将 多个 CRLF 编码到一个标头字段中的示例?”。您的示例仅显示 一个 CR LF HT 序列....换句话说,它没有回答问题。 @Pacerier 在 Conten-Type 标头字段中有两个 CRLF。一个黄色的,在场地中间。另一个在字段的末尾,在它用作普通 HTTP 标头字段分隔符的下一个字段之前。 你指的是red circle吗?如果是这样,那不是OP所说的。他说的是multiple obs-folds,换句话说,不仅仅是“CRLF”,而是“CRLFHT/SP”。红圈是“CRLF'S'”和“CRLF'C'”。 @Pacerier OP 专门询问“多个 CRLF .. 编码到一个标头字段中”。该示例显示了 Content-Type 字段中的 CRLF,该字段也以 CRLF 结尾。是的,这不是多个obs-fold,但我认为这不是问题。 我知道这个答案有点老了,但是你写了Moreover, it seems that line folding wasn't even completely deprecated, and its use is still allowed for the HTTP media type header.。什么是HTTP media type header,是否有这样使用现在已弃用的标题行折叠的示例?

以上是关于是否可以在 HTTP 标头字段中包含多个 CRLF?的主要内容,如果未能解决你的问题,请参考以下文章

Exchange电子邮件是否始终在标头中包含SMTP地址?

是否可以在XMLHttpRequest标头中包含antiforgerytoken?

在 HTTP 数据包(Cookie、标头或 JSON)中包含 JWT 令牌的正确方法

在 python 请求中包含多个标头

如何在 http 标头中包含 UserID 和 Password?

在进行 ajax 调用时在 HTTP 标头中包含 JWT