入力フィルタリングは、出力エスケープの問題に対する答えではありません。カジュアルな攻撃者を追い払うことは、せいぜい部分的で信頼性の低い防御です。私の見解では、フレームワークプロバイダーがXSSの問題に対する強固な防御としてそれを提供することは誤った方向に進んでおり、無責任です。
ドロップしたテキストコンテンツをHTML文字列にHTMLエンコードする必要があります。同様に、JS文字列にドロップするテキストコンテンツをJavaScript-string-literal-encodeする必要があります。SQLクエリにドロップするテキストコンテンツはすべてSQLエスケープする必要があります。等々。
これは、作成する出力形式に応じて完全にコンテキストに依存します。出力ターゲット形式がわからない入力レイヤーでは処理できません。
HTTPパラメータ入力以外のソースからコンテンツを取得し、それを出力に含める場合、保護されません。逆に、HTTP入力を使用してHTML以外のものを作成している場合、コンテンツは不必要に破壊されます。さらに、もちろん、完全に有効な入力をブロックしています。SOがリクエスト検証を使用した場合、前述のときに中断されるため、この会話を行うことはできません<script>
。
賢明なコーダーは、既存のライブラリ/フレームワークレイヤーを使用して、エスケープ関数を手動で呼び出す必要をなくします。これは、忘れがちなためです。したがって、文字列連結からSQLを作成する代わりに、パラメータ化されたクエリを使用することをお勧めします。HTMLの場合も同じです。適切に設計されたテンプレート言語またはWebコントロールセットを使用すると、HTMLエスケープがデフォルトで発生するため、何もする必要がなくなります。
ASP.NETとWebフォームは、この点で部分的に適切に設計されています。「はい」を設定TextBox.Text=...
すると、必要に応じてコンテンツがエスケープされ、それ以上のことは何もできなくなります。一方、設定した場合Literal.Text=...
、デフォルトではエンコードされません(これはLiteralMode
プロパティで変更できます)。この不一致は非常に残念です。