1

プログラミングとはあまり関係ないのですが、プログラムで使っているのでこちらで聞いたほうがいいと思いました。基本的に、これは HTTP リクエストの異常の処理に関する質問です。

標準的なリクエストは次のようになります。

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

私の質問は、通常は改ざんされない HTTP 要求の一部で、HTTP が「特殊文字」をどのように処理する必要があるかということです。たとえば、メソッドが「GET」ではなく「POST ME」だったとしたらどうなるでしょうか (つまり、スペースを含める)。これは %20 にエンコードされますか?

別の例として、ヘッダーの 1 つを "Class:Test: example" とし、ヘッダー名に ":" を追加したいとします (ヘッダー値は "example")。これは %3A にエンコードされますか?

注: これは、Web サーバーがそのようなエンコーディングを受け入れるかどうかに関するものではありません。これは、それがどのように行われるべきかについてです。私のプログラムはファズテスターなので、この種のものをテストすることになっています!

4

3 に答える 3

2

2つの質問には、「いいえ」と「はい、しかし...」と答える必要があります。

提案する「パーセントエンコーディング」は、http言語の構文ではなく、コンテンツ、値に対して定義されます。プロトコルとペイロードを混在させます。

HTTPを定義するRFCを確認することをお勧めします。構文を明確に定義します。その構文に固執すれば、有効な拡張機能を作成できます(これがあなたがやろうとしていることです)。その構文を破ると、無効なhttpリクエストが作成されます。それは社内でできることですが、そのような要求は、たとえばプロキシが機能するオープンインターネットでは機能しない可能性があります。これらは、構文レベルでの要求を理解する必要があります。

質問2の答えは「はい、でも」です、と私は書きました。だから、しかし、いくつかの言葉:

提案したように2番目の':'をエンコードすると、そのようなヘッダーを指定でき、それらは有効です。ただし、そこで何をしているのかを理解する必要があります。ヘッダー名に階層を導入しているのではありません。代わりに、「:」を含むヘッダーコンテンツを指定します。それはまったく問題ありません。そのコンテンツを理解し、解釈し、意図したとおりに反応するかどうかは、サーバーコンポーネント次第です。

于 2012-08-01T11:33:56.500 に答える
0

HTTP 仕様では、メソッドはトークンであるため、区切り文字を含めることはできません。したがって、「POST ME」は有効な方法ではありません。

同様に、ヘッダー名もトークンであるため、「:」を含めることはできません。コロンは、ヘッダー名とその内容の間の区切り文字として常に使用されます。

arkascha が言うように、HTTP プロトコルを規定する RFC 2616 を読む必要があります。

于 2012-08-01T11:45:19.713 に答える
0

スペースを含むメソッドの場合、リクエスト行が次のように定義されているため、これは不可能です。

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

Methodは、HTTP/1.1 動詞の 1 つまたは拡張メソッドとして定義されます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) をさらにエスケープする必要はありません。コロンはtoken.

したがって、あなたの例では、 field-name は ですがClassfield-valueは ですTest: example

于 2012-08-01T11:52:54.070 に答える