0

私はコメントシステムを構築しています。コメントは SQL のストアド プロシージャに送信されます。

html、スクリプト、または SQL クエリがテーブルに挿入されないようにする最善の方法は何ですか? これをサーバーサイドでやりたい。

例えば:

INSERT INTO MyTable (UserID, Comment) VALUES (@UserID, @Comment)

攻撃を防ぐために、コメント フィールドを処理し、潜在的な HTML、スクリプト、またはクエリを削除する最善の方法は何ですか? または、特定の文字が含まれている場合に挿入を削除するには? 最終的には、ユーザーがリンクを挿入できるようにしたいと考えています。これにより、クリック可能なリンクとしてサイトに表示されます...

このセキュリティのことは初めてで、明らかに重要です。

どうもありがとう。

4

1 に答える 1

4
  1. すべての変数のパラメーターを使用してパラメーター化されたステートメントを使用すると (実行しているように見えます)、SQL インジェクションについて心配する必要はありません。

  2. 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 ライブラリを使用します。

于 2013-07-14T18:20:10.477 に答える