すべての変数のパラメーターを使用してパラメーター化されたステートメントを使用すると (実行しているように見えます)、SQL インジェクションについて心配する必要はありません。
HTML および JS インジェクションは、データベース ストレージではなく、ページ出力フェーズに関する懸念事項です。データベース層で HTML のエスケープや検証を行おうとすると、フラストレーションがたまり、実りのないものになります。これらの問題に対処するのに適切な場所ではありません。データを見逃したり、誤って処理したり、SQL で文字列を操作するためのツールが弱くなったりします。
ブラックリストは常に失敗するため、「攻撃」の検出に関して考えないでください。代わりに、すべてのテキストを正しく処理することを目指してください。そうすれば、正確であることの副作用として安全になります。HTML ファイルにドロップする可変テキストは、HTML エスケープする必要があります。JavaScript 文字列リテラルにドロップする可変テキストは、JS エスケープする必要があります。
標準の .NET テンプレートを使用している場合は、<%:
構文を使用してテキストを HTML エスケープします。代わりにそれを出力タグとして使用すると、<%=
問題ありません。同様に、Web フォームを使用している場合は、Text
プロパティが自動的に HTML エスケープされるコントロールを使用します。(残念ながら、これは矛盾しています。) マークアップを直接生成する必要がある場合は、HttpUtility.HtmlEncode
明示的に使用してください。
JavaScript 文字列リテラルのエンコードは、少し複雑です。はありますがHttpUtility.JavaScriptStringEncode
、JS 文字列は通常、HTML<script>
ブロック内 (ネイティブ JS にないシーケンスは危険です) または HTML インライン イベント ハンドラー (JS エンコードしてからHTML</
エンコードする必要がある場所) 内に存在します。通常の HTML エスケープを使用して DOM で JS に送信するデータをエンコードする方が、より良い戦略になる傾向があります。たとえば、属性や.data-
<input type="hidden">
ユーザーがカスタム マークアップを入力できるようにする必要がある場合は、入力時に、承認された要素と属性の小さなホワイトリストにフィルターする必要があります。既存の HTML purifier ライブラリを使用します。