私の目標は、要求を見て、POST (XSS 攻撃、SQL インジェクションなど) からコンテンツを除外する IIS マネージ モジュールを作成することです。
ただし、実際にリクエストをフィルタリングするプロセスで、私は今ハングアップしています。ここに私がこれまでに持っているものがあります:
モジュールの Init で、HttpApplication.BeginRequest をローカル イベント ハンドラーに設定します。そのイベント ハンドラーでは、次の行を設定しています。
if (application.Context.Request.HttpMethod == "POST")
{
application.Context.Request.Filter = new HttpRequestFilter(application.Context.Request.Filter);
}
また、application.Context.Response.Filter に HttpResponseFilter を設定しました。
HttpRequestFilter と HttpResponseFilter は Stream の実装です。
応答フィルターでは、次のように設定しています (Stream.Write のオーバーライド)。
public override void Write(byte[] buffer, int offset, int count)
{
var Content = UTF8Encoding.UTF8.GetString(buffer);
Content = ResponseFilter.Filter(Content);
_responseStream.Write(UTF8Encoding.UTF8.GetBytes(Content), offset, UTF8Encoding.UTF8.GetByteCount(Content));
}
ResponseFilter.Filter は単純な String.Replace であり、実際、テキストを正しく置き換えます。
ただし、リクエスト フィルターには 2 つの問題があります。現在 RequestFilter にあるコード (Stream.Read のオーバーライド):
public override int Read(byte[] buffer, int offset, int count)
{
var Content = UTF8Encoding.UTF8.GetString(buffer);
Content = RequestFilter.Filter(Content);
if (buffer[0]!= 0)
{
return _requestStream.Read(UTF8Encoding.UTF8.GetBytes(Content), offset, UTF8Encoding.UTF8.GetByteCount(Content));
}
return _requestStream.Read(buffer, offset, count);
}
これには2つの問題があります。まず、フィルターは 1 回ではなく 2 回呼び出され、要求の 1 つは基本的に /0 のストリームです。(バッファ[0]のifチェックは現在これをフィルタリングしていますが、何か間違った設定をしていると思います)
第二に、読み取りで .GetString を使用してコンテンツを正しく取得し、それを RequestFilter.Filter(美化された string.replace()) で変更しているにもかかわらず、if ステートメント内でエンコードされたバイト コンテンツを返すと、入力は無修正。
これが私が理解しようとしているものです:
1) フィルターの前にチェックして、チェックしているのは POST のみであり、他のときに呼び出されていないことを確認できるものはありますか? Application.Context.Request.Filter を正しく設定していませんか?
2) _requestStream (クラスに送信した HttpApplication.Context.Request.Filter) への書き換えが表示されない理由について、私は本当に混乱しています。私が間違っていることについての意見は本当にありがたいです。
また、HttpApplication.Request と HttpApplication.Context.Request に違いはありますか?
編集: 詳細については、テキスト ボックス、ボタン、およびラベルを含む単純な .aspx ページでこれをテストしています。ボタンをクリックすると、テキスト ボックスのテキストがラベルのテキストに割り当てられます。理想的には、フィルタリングする必要があるコンテンツをテキストボックスに入れると、投稿を傍受して書き換えることで、内容が変更されたものとしてサーバーにヒットする可能性があることを理解しています. モジュールとコードのブレークポイントを使用してテストを実行しましたが、.aspx ページのコード ビハインドがヒットする前にモジュールが完了します。.aspx ページは、フォームから渡された値を取得し、実行しようとしたフィルタリングを無視します。