質問: プレースホルダのことを調べていましたがその際に バインド処理を実現するライブラリによっては,SQL構文を変化させるようなSQLインジェクションを許してしまう,脆弱な実装のものが存在する可能性を否定できない。 よって,SQLインジェクション脆弱性対策には,なるべく静的プレースホルダを使用することを推奨する。 との記載がありました。 なので静的プレースホルダを使用すると思っていたのですがなぜPHPのデフォルトは動的プレースホルダがデフォルトになっているのでしょうか? 動的プレースホルダを使いたい場合は実際にどのような注意をすればいいのでしょうか? ご解答宜しくお願いいたします。 出典 リンク内容
回答: > > なぜPHPのデフォルトは動的プレースホルダがデフォルトになっているのでしょうか? > > > これは、動的プレースホルダにするメリットもあるということと、歴史的な経緯によるものです。 MySQLは元々静的プレースホルダ(prepared statement)をサポートしておらず、4.1になって追加されました。そのため、デフォルトが動的プレースホルダになっているという状況があります。 また、静的プレースホルダが後から追加されたということもあり、性能や安定性が、動的プレースホルダの方が優れているので、デフォルトが動的プレースホルダになっている、という面もあると思います。 > > 動的プレースホルダを使いたい場合は実際にどのような注意をすればいいのでしょうか? > > > 動的プレースホルダを使っていてSQLインジェクション脆弱性が問題になるのは、以下のケースが考えられます。 1. PHPやMySQのドライバに脆弱性がある場合 2. PDO等の使い方に問題がある場合 実はいずれも、「文字エンコーディング」の設定や扱い方に問題がある場合というのが典型的なケースとなります。現実問題としては、文字エンコーディングとしてUTF-8を使ってる限りにおいては、問題になる可能性はかなり低いと予想されます。 また、文字エンコーディングを正しく指定することが重要です。その辺りの経緯も含めて、下記の記事を参考にしていただければと思います。 PDOにおける一応の安全宣言と残る問題点