ユーザーがアップロードしたファイルをスキャンするだけでなく、ユーザープロファイルやコメントなどのフォームを悪用して悪意のあるスクリプトを送信しないようにしたいと思います。そうするためのいくつかの既知の良い方法は何ですか?スクリプトインジェクション攻撃のチェックは、クライアント側またはサーバー側のどちらで行う必要がありますか?
FWIW、私はNPMでいくつかのセキュリティ関連モジュールをチェックしましたが、それらは主に他のモジュールのセキュリティに関係しているようで、何か役に立つものを見逃している可能性があります。
私が認識している方法の1つは、すべてのHTMLタグを取り除くことですが、少し手荒く、おそらくすべての場合に効果的ではないと思います。
更新:質問が立っているように、注入タグにもかかわらず、それはおそらくxssであるという印象を与えました。したがって、これは、xssとsqlインジェクションの両方についてであることを明確にするためです。
[〜#〜] sql [〜#〜]
SQLインジェクションに対する保護は、準備されたステートメントを使用して行われます。一般的に言えば、SQLステートメント内でユーザーが生成した文字列を手動で連結することは避けるのがベストプラクティスです。
代わりに?
アノテーションを追加し、入力文字列をパラメータとして提供します。ドライバーは、SQLインジェクションの試行や予期しないユーザー入力を確実にブロックします。
MySQLの例-
PreparedStatement ps = connection.prepareStatement("INSERT INTO tbl VALUES (?)");
ps.setString(1, "'abc'); TRAUNCATE TABLE users; SELECT (1");
ps.executeUpdate();
注入の試行は失敗します。
[〜#〜] xss [〜#〜]
ユーザーが生成した文字列をHTMLエスケープするか、<
と>
および>
と<
、それをクライアントに送信する前、またはデータベースに書き込むとき。
また、 クロスサイトリクエストフォージェリ(CSRF)防止に関するチートシート ガイドも確認してください。
HTMLタグを取り除くことは、XSSから身を守るための十分なアプローチではありません。次の入力を検討してください。
<scri<script>pt>
<script>
タグ、別のスクリプトタグが作成されます。これはほんの一例です-使用できる他の多くの攻撃があります。
サーバー側でXSSから自分自身を保護することを検討する必要があります-この方法では、ユーザーはクライアント側のコードを変更またはバイパスすることができません。
XSSから身を守ることは完全に実行可能ですが、正しいアプローチを使用していることを確認する必要があります。いつものように OWASPの指示 自分を守る方法については、おそらく最善の方法です。
ユーザー入力を処理する際によく議論される2つの主要な方法があります。これらの2つのメソッドはvalidationとsanitisationです。
これらはどちらもサーバー側で行うのが最も確実です。クライアント側の保護は、クロスサイトスクリプティングやSQLインジェクションなどの攻撃を防ぎません。
特に、あなたはクロスサイトスクリプティング攻撃について話していると思います。このノードモジュール( https://github.com/theSmaw/Caja-HTML-Sanitizer )は、達成しようとしていることに適しているようです。
すべてのHTMLタグを取り除くことは、必ずしも素晴らしいアイデアではありません。これは、イベントベースのクロスサイトスクリプティングがまだ可能である可能性があるためです。例えば:
_<a href="/yourprofilename">yourprofilename</a>
_
ユーザーがyourprofilenameセクションを変更できる場合は、次の入力を検討してください。
" onfocus="Prompt(document.location); autofocus"
これはリンクをこれに変えます:
<a href="/" onfocus="Prompt(document.location);" autofocus">yourprofilename</a>
これにより、HTMLタグを使用せずにクロスサイトスクリプティングがトリガーされます。