ユーザーがWeb アプリケーションのページ内<
またはその内容を含む内容を投稿するたびに、この例外がスローされます。>
誰かがテキスト ボックスに文字を入力したために例外をスローしたり、Web アプリケーション全体をクラッシュさせたりすることが賢明かどうかについては議論したくありませんが、これを処理するためのエレガントな方法を探しています。
例外をトラップして表示する
エラーが発生しました。戻ってフォーム全体を再度入力してください。ただし、今回は<
私にはプロフェッショナルすぎるように思える。
ポスト検証 ( validateRequest="false"
) を無効にすると、このエラーは確実に回避されますが、ページはさまざまな攻撃に対して脆弱な状態になります。
理想的には、HTML制限文字を含むポストバックが発生すると、フォームコレクションのポストされた値は自動的にHTMLエンコードされます。したがって、.Text
テキストボックスのプロパティは次のようになります。something & lt; html & gt;
ハンドラーからこれを行う方法はありますか?
ベストアンサー1
投稿されたすべてのデータをエンコードしようとするのは、間違った角度から取り組んでいると思います。
「<
」は、データベース フィールド、構成、ファイル、フィードなどの他の外部ソースから取得される場合もあることに注意してください。
さらに、「<
」は本質的に危険ではありません。特定のコンテキスト、つまり HTML 出力にエンコードされていない文字列を書き込む場合 (XSS のため) にのみ危険です。
他のコンテキストでは、異なるサブ文字列が危険です。たとえば、ユーザーが指定した URL をリンクに書き込む場合、サブ文字列 " javascript:
" は危険である可能性があります。一方、一重引用符は、SQL クエリで文字列を挿入するときには危険ですが、フォームから送信された名前の一部である場合や、データベース フィールドから読み取られた場合は完全に安全です。
肝心なのは、危険な文字についてランダムな入力をフィルター処理できないということです。なぜなら、適切な状況下ではどの文字も危険になる可能性があるからです。特定の文字が別のサブ言語に渡って特別な意味を持つようになるため、危険になる可能性がある時点でエンコードする必要があります。文字列を HTML に書き込む場合は、Server.HtmlEncode を使用して、HTML で特別な意味を持つ文字をエンコードする必要があります。文字列を動的 SQL ステートメントに渡す場合は、異なる文字をエンコードする必要があります (または、準備されたステートメントなどを使用してフレームワークにエンコードさせる方がよいでしょう)。
文字列を HTML に渡すすべての場所で HTML エンコードしていることが確実な場合は、ファイル内のディレクティブValidateRequest="false"
を設定します。<%@ Page ... %>
.aspx
.NET 4では、もう少し作業が必要になる場合があります。場合によっては、<httpRuntime requestValidationMode="2.0" />
web.configに以下を追加する必要があります(参照)。