2012-02-04 8 views
1

HTTP要求メソッドとヘッダーに基づいて、HTTPサーバーは、HTTP要求ヘッダーの終了CRLFCRLFの後にメッセージ本文を期待するかどうかを判断する必要があります。 、それは何バイトの長さですか。HTTP要求メッセージ本文の存在と長さ

この計算はどのように行われますか?要求メソッドとヘッダのどのような機能によって、要求メッセージ本文の長さを計算できますか。

フォロー:ヘッダを解析した後ので

HTTPサーバは、単純に次の操作を実行できます。

size_t RequestMessageBodyLength() 
{ 
    if (RequestHeaderExists("Content-Length")) 
     return RequestHeaderValue("Content-Length"); 
    else 
     return 0; 
} 

は、上記でカバーされていないが、コーナーケースはありますか?

答えて

2

hereを指定し、おそらくhereより良く説明され、Content-Lengthと呼ばれ、このため全体のヘッダが存在する(Iはない期待し、HEAD要求の場合はいない要求、応答のみのためのものです)。フォローする

回答:

はい、サーバーは、それがセキュリティが心配ではないとして、あなたは上記の投稿の擬似コードを使用することができます。セキュリティに関する一般的なルールは、生成しなかった入力を信頼しないことです。この場合、攻撃者はヘッダContent-Length: 1000000で数千のリクエストを送信することができ、サーバは何千万バイトものバッファを割り当て、コンテンツが到着するのを待って正当なユーザへのサービスを拒否します。実動HTTPサーバーはこの可能性を考慮し、タイムアウトやその他の手段を使用してこの問題が発生しないようにするか、攻撃者が作成するのが難しいことを確認する必要があります。

+0

上記を参照してください –

+0

あなたはContent-Lengthの長さの単一のバッファを割り当てていると仮定していますが、単純にそれらの合計量のチャンクをストリームすることができます。 HTTP 1.1 Keep-AliveをサポートするためにContent-Lengthフィールドを尊重する必要があります。そうしないと、1つのリクエストがいつ終了し、新しいリクエストが開始されるかを知る方法がありません。 –

+0

@ user1131467しかし、「どこに行くかはどこにあるのか」はアプリケーションによって異なります。 1つのアプリケーションでは、CGIを使用していて、子プロセスのファイル記述子をリダイレクトするだけで、アプリケーションを書いた人は誰でもセキュリティを気にすることができます。しかし、別のアプリケーションでは、Railsのようなサーバーを書くかもしれません。Rubyコードの実行が始まると、ブラウザーがキーと値のペア "password = secret"を投稿したかどうかを知りたいと考えます。その場合は、すべてのデータが到着するのを待ってから、説明したDoS攻撃から防御するためにタイムアウトを使用する必要があります。 –

0

メッセージの送信者が計算したメッセージ本文の長さ。長さの値は、メッセージがアセンブルされたときにHTTPヘッダーのContent-Lengthに格納されます。

+0

上記のフォローアップを参照 –

関連する問題