1

Request Validation をオンにしたことがなく、ユーザー入力を Html エンコードしていない従来の ASP.Net サイト (最近 .NET 4.0 にアップグレードしたもの) があります。

私の解決策は、リクエストの検証をオンにし、Global.asax で HttpRequestValidationException をキャッチして、ユーザーをエラー ページにリダイレクトすることでした。何千もの場所で行う必要があるため、ユーザー入力を Html エンコードしません。私のアプローチが、データベースに保存される XSS ベクトルを停止することを願っています。

ただし、データベースに XSS ベクトルが既に保存されている場合は、すべての出力を Html エンコードする必要があると思います。残念ながら、これを成功させるための開発とテストのリソースは非常に限られています。私が経験する必要がある変更のリストを思いついた:

  1. すべての <%= %> を検索して <%: %> に置き換えます。
  2. すべてのラベルを検索してリテラルに置き換え、Mode="Encode" を追加します。
  3. すべての eval() を HtmlEncode でラップします。

私の質問は次のとおりです。

  1. すべての出力を自動的に Html エンコードする簡単な方法はありますか?
  2. 上記のリストに欠けているものはありますか?
  3. 注意すべき落とし穴はありますか?

ありがとう。

4

1 に答える 1

0

すべての <%= %> を検索して <%: %> に置き換えます。

置き換えるのが難しくなる <%# と Response.Write を忘れないでください

すべてのラベルを検索してリテラルに置き換え、Mode="Encode" を追加します。

ただし、以前に生成されたスパンのすべてのフォーマットが失われ、DOM と対応する js/css が壊れます。

また、Mode="PassThrough" ですべてのリテラルを検索し、それらを Encode に設定する必要があります。

すべての eval() を HtmlEncode でラップします。

はい、上記の <%# 問題のサブセットのようです

また、ファンキーな render メソッドを使用していくつかのカスタム コントロールを作成することもできます

バックエンドとしてリレーショナル DB が「のみ」あると仮定すると、DB にアクセスできる場合は、まず、値にマークアップが含まれる問題のあるテーブルと列を特定します。

私はその後:

  • DB 内のこれらの値をできる限りクリーンアップします。
  • ページ内の対応する出力の HtmlEncoding を確認する

次に、基本的なグローバル置換 <%= を <%: に変更し、長期的には出力をサニタイズすることができます。

于 2012-11-09T15:09:00.863 に答える