是否可以在 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,换句话说,不仅仅是“CR
LF
”,而是“CR
LF
HT
/SP
”。红圈是“CR
LF
'S'
”和“CR
LF
'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?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在XMLHttpRequest标头中包含antiforgerytoken?
在 HTTP 数据包(Cookie、标头或 JSON)中包含 JWT 令牌的正确方法