保存中のウェブに入力フィールドがあります。このフィールドは、私が制御できない他のシステムで表示される可能性があるため、このフィールドで許可されるものを制限したいのですが、ユーザーの便宜のためにいくつかの一般的な特殊文字を許可したいと思います。
これは私が思いついたものです(私はこれらの文字だけをホワイトリストに載せます):
XSSインジェクション、SQLインジェクション、そして結局私が考えていなかった他のことに関して、これが「安全」かどうかを確認したいと思います。
追伸これが攻撃を防ぐための正しい方法ではないことは知っていますが、データの使用が私の制御不能になるため、これが必要です。
tl/dr:悪意のある入力から他のシステムを保護することはできません。インジェクション攻撃からの保護は、データの使用方法に強く依存します。最善の方法は、明らかな悪意のあるペイロードの侵入を防ぐことですが、反対側のアプリケーションが適切なセキュリティを実践していない場合、提案されたホワイトリストでも重大な脆弱性が残る可能性があります。
残念ながら、最終的にインジェクション攻撃から保護することは完全にコンテキスト(アプリケーションがデータをどのように使用しているか)に依存するため、実行しようとしていることはほぼ不可能です。ランダムな例を1つ挙げると、誰かがあなたの入力を次のようなHTMLページに反映するとします。
_<script type="text/javascript">
var dataFromIlyaChernomordik=[DATA];
</script>
_
データは、二重引用符なしでJavaScriptに直接挿入されることに注意してください。残念ながら、あなたのサイトに入ったデータは:
_eval(String.fromCharCode(97,108,101,114,116,40,39,72,73,39,41))
_
これは次のように変換されます。
_eval("alert('HI')")
_
きっとこれがどこに行くのかわかるでしょう。 A-Z0-9,.()
のみを使用し、宛先での適切な入力処理の欠如と組み合わせることで、任意のJavaScriptを注入できるようになりました。ゲームオーバー。
だからすべてを取り除きましょう:_A-Z0-9-:
_
ええ、でもそのハイフン-危険そうに見え、bashではさまざまな意味があります。誰かがこの入力を使用してコマンドラインで実行する文字列を作成している可能性はありますか?データを適切にエスケープするのを忘れる可能性はありますか?もしそうなら、あなたはハイフンを捨てるべきです。スペースとコロンも、pythonスクリプトのevalコマンド内でデータを使用している場合に問題を引き起こす可能性があります。
重要なのは、間違った状況では何でも危険になる可能性があるということです。その結果、悪意のあるユーザーデータからシステムを適切に保護する唯一の方法は、ユーザー入力が使用されているコンテキストを理解することです。不明なコンテキストで安全である可能性がある唯一の入力は空の文字列です(ただし、空の文字列ではなく誤ってnull文字を使用すると、問題が発生します!)
本質的に、あなたは [〜#〜] waf [〜#〜] を構築しようとしていますが、それらはWebアプリケーションにセキュリティを提供する役割を果たしている可能性があります(すでに非常に特殊なコンテキストです) -WAFは決してすべて)から保護しません。十分な侵入テストを行った人は、WAFの見落としのためにWAFを回避することについて多くのストーリーを持っていますルール。
最も明白な悪意のあるペイロードを除外することはできますか?はい。すべてのコンテキストで危険なペイロードをすべて停止できますか?絶対にありません。