2012-01-03 8 views
6

私は、Webセキュリティにいくつかの研究をやっている、と私の記事の改訂は言った:SQLインジェクションの防止 - プリペアドステートメントを使用する場合、なぜ入力をエスケープする必要がありますか?

「アプリケーションは、プリペアドステートメントを使用するストアドプロシージャと入力をエスケープする必要があり、SQLインジェクションを防ぐためにことは明らかです」

私の質問です:これらの方法の1つでは不十分ですか? OK、プリペアドステートメントやストアドプロシージャは単純なエスケープより優れていますが、PDOを使用すると、なぜ私は入力をエスケープするか、ストアドプロシージャを持つべきですか?これは理にかなっていますか?

+1

「(準備されたステートメントまたはストアドプロシージャ)と入力をエスケープ」*。 :)(それは私の愚かかもしれないが)正直に言うと、私は* *としてそれを解釈する「ステートメントまたはストアドプロシージャを作成したり、入力をエスケープ」でしょう。ありがとう。 –

答えて

8

私はに改訂の文言を変更します:アプリケーションがSQL文字列に補間する前に、準備された文を使用した入力をエスケープ、またはフィルタアプリケーションデータする必要があり、SQLインジェクションを防ぐためにことは明らかである

パラメータとして渡す場合は、値をエスケープする必要はありません。実際には、データにリテラルバックスラッシュを挿入するため、そうしないでください。

クエリパラメータを使用できない場合は、SQL文に文字列を挿入する必要があります。例:

  • テーブル名とカラム名は、それぞれown syntax for delimited identifiersです。これらは準備時にSQLクエリの一部でなければならないため、RDBMSはそれらを解析して検証できます。

  • SQLキーワード。サニタイズする必要がありますが、区切られていないためエスケープできません。

  • その他の構文または式。

  • 準備時にリテラル値を指定する必要がある場合があります。 MySQLのフルテキスト関数は、検索パターンのパラメータをサポートしていません。

ストアドプロシージャは、SQLインジェクションに対する防御ではありません。ストアド・プロシージャ内で安全でない動的SQL文を準備して実行できます。それについての素晴らしい話はhttp://thedailywtf.com/Articles/For-the-Ease-of-Maintenance.aspxを参照してください。

私は私のプレゼンテーションSQL Injection Myths and Fallacies内のすべてのこれらのケースをカバーしています。それはあなたに役立つリソースかもしれません。

また、私は私の本の章のSQLインジェクションの防衛、SQL Antipatterns: Avoiding the Pitfalls of Database Programmingをカバーしています。 * *のようなあなたの質問私はあなたが句を解釈している印象を受ける*「プリペアドステートメント、ストアドプロシージャと入力をエスケープ」を読んでから、

+0

本当に良いもの。 – Daniel

4

私がPDOを使用している場合、なぜ入力をスケープするか、ストアドプロシージャを持つべきですか?

限り、あなた常に使用PDOとして、私は、入力エスケープかのSPを気にする理由は表示されません。

2

疑問がある場合は、次のように質問してください:このプレーンな入力データをAPIによってラインからエスケープしますか?ほとんどの場合、入力データから手動でSQL文を作成する場合を除いて、そのまま実行されます。

PDOを使用する場合は、エスケープしないでください。パラメータがのJDBC準備文を使用する場合は、エスケープしないでください。同様に、他のほとんどのAPIもこれを処理します。ストアドプロシージャはエスケープされたデータにも関係なく、プロシージャを実行するSQLで入力データがエスケープされない場合、SQLインジェクションセキュリティの問題を魔法のように回避することはありません。

SQL文に入れるSQL-Escapeデータです。決してSQL-EscapeデータはSQL文の外にはありません。

関連する問題