这与编程无关,但我在程序中使用它,所以我认为最好在这里问一下。基本上这是关于处理HTTP请求中的异常的问题。
标准请求可能如下所示:
GET / HTTP/1.1
Host: example.com
User-Agent: Firefox
我的问题是,HTTP如何处理HTTP请求中通常不被篡改的部分中的“特殊字符”。例如,如果该方法是“POST ME”而不是“GET”(即包含空格),该怎么办?这会被编码为%20吗?
另一个例子,假设我希望我的一个标题是“Class:Test:example”,标题名称中包含额外的“:”(标题值为“example”)。这会被编码为%3A吗?
注意:这不是关于那里的任何网络服务器是否会接受这样的编码;这是关于如何做到的。我的程序是一个模糊测试器,所以它应该测试这种东西!
答案 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-value
为Test: example
。