1. ホーム
  2. asp.net

[解決済み] クライアントから危険な可能性のあるRequest.Formの値が検出された

2022-03-15 22:55:22

質問

を含む何かを投稿するたびに、ユーザーは < または > という例外がスローされます。

誰かがテキストボックスに文字を入力したために例外をスローしたり、Webアプリケーション全体をクラッシュさせることのスマートさについて議論するつもりはありませんが、私はこれを処理するエレガントな方法を探しているのです。

例外をトラップして表示する

<ブロッククオート

エラーが発生しました。もう一度、フォーム全体を入力し直してください。

は、プロフェッショナルとは言えないと思うのですが。

ポストバリデーションを無効にする( validateRequest="false" を使用すると、このエラーを確実に回避できますが、多くの攻撃に対して脆弱なページが残ります。

理想は HTML 制限文字を含むポストバックが発生したとき、Form コレクションに投稿された値は自動的に HTML エンコードされます。 そのため .Text プロパティは次のようになります。 something & lt; html & gt;

ハンドラからこれを行う方法はありますか?

どのように解決するのですか?

投稿されたデータをすべてエンコードしようとするのは、間違った方向から攻めているのではないでしょうか。

なお、" < は、データベースのフィールド、設定、ファイル、フィードなど、他の外部ソースから来ることもできます。

さらに、" < は、本来は危険なものではありません。危険なのは、HTML出力にエンコードされていない文字列を書く場合(XSSのため)という特殊な状況においてのみです。

他の文脈では、異なる部分文字列は危険です。例えば、ユーザーが提供したURLをリンクに書き込む場合、部分文字列 " javascript: は危険かもしれません。一方、シングルクォート文字は、SQLクエリで文字列を補間する場合には危険ですが、フォームから送信された名前やデータベースのフィールドから読み込んだ名前の一部であれば、完全に安全です。

要するに、ランダムな入力に対して危険な文字をフィルタリングすることはできないということです。なぜなら、どんな文字でも適切な状況下では危険である可能性があるからです。ある特定の文字が、特別な意味を持つ別のサブ言語に渡るために危険になる可能性がある時点で、エンコードする必要があります。HTMLに文字列を書くときは、Server.HtmlEncodeを使って、HTMLで特別な意味を持つ文字をエンコードすべきです。動的なSQL文に文字列を渡す場合は、異なる文字をエンコードする必要があります(あるいは、プリペアドステートメントなどを使ってフレームワークに任せるのがよいでしょう)。

いつ を設定すると、HTMLに渡す文字列はすべてHTMLエンコードされるようになります。 ValidateRequest="false" の中に <%@ Page ... %> ディレクティブを .aspx ファイルを作成します。

.NET 4では、もう少しの工夫が必要かもしれません。時には <httpRuntime requestValidationMode="2.0" /> をweb.configに追加してください( 参照 ).