私の考えでは、SQLインジェクション攻撃は次の方法で防止できます。
- 入力を慎重にスクリーニング、フィルタリング、エンコードする(SQLへの挿入前)
- 使用して準備された文 /パラメータ化クエリを
それぞれに長所と短所があると思いますが、なぜ#2が離陸し、インジェクション攻撃を防ぐための事実上の方法であると見なされるようになったのですか?単に安全でエラーが発生しにくいのですか、それとも他の要因がありましたか?
私が理解しているように、#1が適切に使用され、すべての警告が処理されれば、#2と同じくらい効果的です。
サニタイズ、フィルタリング、エンコード
私の側では、サニタイズ、フィルタリング、およびエンコードの意味が混乱していました。この場合、サニタイズとフィルタリングは入力データを変更または破棄する可能性があることを理解していますが、エンコードはデータをそのまま保持しますが、エンコードしますインジェクション攻撃を避けるために適切に。データをエスケープすることは、それをエンコードする方法と考えることができると信じています。
パラメータ化されたクエリとエンコーディングライブラリ
parameterized queries
との概念がencoding libraries
相互に交換可能に扱われている答えがあります。私が間違っている場合は修正しますが、私はそれらが異なっているという印象を受けています。
私が理解しているのは、encoding libraries
どんなに優れていても、SQL「プログラム」を変更する可能性は常にあるということです。
Parameterized queries
一方、SQLプログラムをRDBMSに送信すると、RDBMSはクエリを最適化し、クエリ実行プランを定義し、使用するインデックスを選択するなどして、RDBMS内の最後のステップとしてデータをプラグインします。自体。
エンコーディングライブラリ
data -> (encoding library)
|
v
SQL -> (SQL + encoded data) -> RDBMS (execution plan defined) -> execute statement
パラメータ化されたクエリ
data
|
v
SQL -> RDBMS (query execution plan defined) -> data -> execute statement
歴史的意義
いくつかの回答では、歴史的に、パラメーター化されたクエリ(PQ)はパフォーマンス上の理由で作成され、インジェクション攻撃の前にエンコードの問題をターゲットにしたと言われています。ある時点で、PQはインジェクション攻撃に対しても非常に効果的であることが明らかになりました。私の質問の精神を維持するために、なぜPQが選択の方法であり続け、SQLインジェクション攻撃の防止に関して、他のほとんどの方法よりも優れているのでしょうか?