HTTP请求字段中的特殊字符

时间:2012-08-01 11:27:01

标签: http webserver

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

标准请求可能如下所示:

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

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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

您可能需要查看定义HTTP的RFC。它明确定义了一种语法。如果您坚持使用该语法,则可以创建有效的扩展(这是您尝试执行的操作)。如果您破坏该语法,则会创建无效的http请求。这可能是你可以在内部做的事情,但很可能这样的请求在开放的互联网中不起作用,例如代理发挥作用。这些必须在y语法层面理解你的请求。

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

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

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

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

对于Class:Test: example,http标头为defined

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),标题行中的第一个总是被认为是一个分隔符,因为token中不允许冒号。 / p>

因此,在您的示例中,字段名称为Class,而field-valueTest: example