私はこれをしばらく検討しており、EnableHeaderCheckingを に設定true
することで、実際には HTTP ヘッダー インジェクション攻撃を防ぐのに十分であるという結論を導き出しました。
「反映された」ASP.NETコードを見ると、次のことがわかりました。
- カスタム HTTP ヘッダーを HTTP 応答に追加する唯一の方法は、HttpResponse.AppendHeaderメソッドを使用することです。
- HttpResponse.AppendHeaderのいずれか
HttpResponseHeader
(内部)のインスタンスを作成します
- またはコール
HttpResponseHeader.MaybeEncodeHeader
(の場合IIS7WorkerRequests
)
- またはそれぞれのプロパティを割り当てます ( RedirectLocationやContentTypeなどの既知のヘッダーの場合)
HttpResponseHeader
インスタンスは、RedirectLocationやContentTypeなどの既知のヘッダーが送信される前に作成されます ( HttpResponse.GenerateResponseHeaders
)
- コンストラクターはEnableheaderChecking設定を
HttpResponseHeader
チェックし、設定されている場合は呼び出しますHttpResponseHeader.MaybeEncodeHeader
true
HttpResponseHeader.MaybeEncodeHeader
HTTPヘッダーインジェクション攻撃を不可能にする改行文字を正しくエンコードします
これは、私がどのようにテストしたかを大まかに示すためのスニペットです。
// simple http response splitting attack
Response.AddHeader("foo", "bar\n" +
// injected http response, bad if user provided
"HTTP/1.1 200 OK\n" +
"Content-Length: 19\n" +
"Content-Type: text/html\n\n" +
"<html>danger</html>"
);
上記は、 EnableHeaderCheckingを明示的にオフにした場合にのみ機能します。
<httpRuntime enableHeaderChecking="false"/>
Fortify は単純に構成を考慮しないため ( EnableHeaderChecking を明示的に設定しても効果がありません)、常にこの種の問題を報告します。