1

这与编程无关,但我在程序中使用它,所以我认为最好在这里问。本质上这是一个关于处理 HTTP 请求异常的问题。

标准请求可能如下所示:

GET / HTTP/1.1
Host: example.com
User-Agent: Firefox

我的问题是,HTTP 应该如何处理通常不会被篡改的 HTTP 请求部分中的“特殊字符”。例如,如果方法是“POST ME”而不是“GET”(即包含空格)怎么办?这会被编码为 %20 吗?

另一个例子,假设我希望我的一个标题是“Class:Test:example”,标题名称中有额外的“:”(标题值为“example”)。这会被编码为 %3A 吗?

注意:这不是关于是否有任何网络服务器会接受这种编码;这是关于它应该如何做的。我的程序是一个模糊测试器,所以它应该是测试这种东西!

4

3 回答 3

2

这两个问题必须回答为“否”和“是的,但是……”

您建议的“百分比编码”是为内容、值定义的,而不是为 http 语言语法定义的。您混合协议和有效负载。

您可能想查看定义 HTTP 的 RFC。它清楚地定义了一种语法。如果您坚持该语法,您可以创建有效的扩展(这是您正在尝试做的)。如果您破坏该语法,则会创建无效的 http 请求。这将是你可以在内部做的事情,但这些请求很可能在开放的互联网上不起作用,例如代理在其中发挥作用。这些必须在 y 语法级别上理解您的请求。

我写道,对于问题 2,答案是“是的,但是”。所以对BUT说几句话:

如果您按照建议对第二个“:”进行编码,则可以指定此类标头并且它们是有效的。但是,您应该了解您在那里所做的事情:您没有在标题名称中引入层次结构。相反,您指定标题内容以包含“:”。那很好。由您的服务器组件来理解、解释和响应该内容。

于 2012-08-01T11:33:56.500 回答
0

HTTP 规范说该方法是一个标记,因此它不能包含任何分隔符。所以“POST ME”不是一个有效的方法。

同样,标题名称也是标记,因此它们不能包含“:”。冒号始终被视为标头名称与其内容之间的分隔符。

正如 arkascha 所说,您应该阅读 RFC 2616,它指定了 HTTP 协议。

于 2012-08-01T11:45:19.713 回答
0

对于包含空格的方法,这是不可能的,因为请求行定义如下:

    Request-Line   = Method SP Request-URI SP HTTP-Version CRLF

Method被定义为 HTTP/1.1 动词或扩展方法之一,是 a token(不能包含空格)。所以服务器遇到的第一个空格标志着方法的结束。因此,方法不能包含空格。您可以对其进行百分比编码,但服务器不知道如何处理类似GET%20ME.

对于您的Class:Test: example,http 标头定义为:

message-header = field-name ":" [ field-value ]
field-name     = token
field-value    = *( field-content | LWS )
field-content  = <the OCTETs making up the field-value
                    and consisting of either *TEXT or combinations
                    of token, separators, and quoted-string>

TEXT 定义为:

TEXT           = <any OCTET except CTLs,
                 but including LWS>

CTL定义为:

CTL            = <any US-ASCII control character
                 (octets 0 - 31) and DEL (127)>

所以不,您不必转义更多的冒号(58),标题行中的第一个始终被视为分隔符,因为冒号不允许在 a 中使用token

因此,在您的示例中,字段名称是Class,而field-valueis Test: example

于 2012-08-01T11:52:54.070 回答