• ベストアンサー

prepareでSQLインジェクション対策?

PHPでMySQLを操作しています。 PDOのprepare()を使えば(プレースホルダを使えば?)、SQLインジェクションは必ず発生しないと言えますか? もし、そうだとすれば、SQLインジェクション対策はかなり簡単ですよね?でも、セキュリティの話でよく取り上げられるということは、実際は他の問題が発生したりするんですかね?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

少し古いドキュメントですが、一読をおすすめします。 安全なSQLの呼び出し方 - 情報処理推進機構 http://www.ipa.go.jp/files/000017320.pdf MySQLの場合はデータベースへの接続方法によっては、 DBMSへ引き渡す前に変数とクエリが結合されてしまうようです。(動的プレースホルダ) そして残念なことに、この接続方法がデフォルトになっているようです。 そして、上記のドキュメントには、次のように記述されています。 ---------------------------------------------------------------------------------- 静的プレースホルダは、SQLを準備する段階でSQL文の構文が確定し、あとからSQL構文が変化することがないため、SQLインジェクションの脆弱性が生じません。 それに対して、動的プレースホルダは、バインド処理を実現するライブラリの実装に問題があると、SQL構文が変化する可能性があり、SQLインジェクションの脆弱性が生じる可能性を否定できません。

newtgecko
質問者

お礼

ご回答ありがとうございます ざっと読んだところ、静的プレースホルダを利用すれば、仕組み上SQLインジェクションが発生しなことがわかりました。 どうすれば、静的プレースホルダを利用できるか、利用できないなら、もう一度「安全なSQLの呼び出し方」をよんで適切なエスケープ処理を勉強します

その他の回答 (1)

  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.1

>>PDOのprepare()を使えば(プレースホルダを使えば?)、SQLインジェクションは必ず発生しないと言えますか? 現時点では、発生しないといえるでしょう。ただ、創意工夫して、それを可能にする方法を将来思いつく方がいるかもしれませんけどね。 >>もし、そうだとすれば、SQLインジェクション対策はかなり簡単ですよね? 実際にプログラムを作った経験があれば、「かなり簡単ですよね?」なんて言えないはずですけどね。 対策と修正にかかるお金、それにかかる時間、修正時のバグ混入への対策とテストなどを考えると、その「かなり簡単なこと」ができないサイトが多いから、現時点でも同様なサイバー攻撃を受けて、それが成功するサイトがあるのだと思います。 >>実際は他の問題が発生したりするんですかね? もちろん、他のセキュリティホールになる部分が沢山あると思います。攻撃側は、そういうセキュリティホールの情報共有を犯罪者仲間と行い、スキルアップしつつ、情報・技術蓄積の精進を通じて、侵入の成功率をアップする努力を日々続けているのだと思っています。

newtgecko
質問者

お礼

>>実際にプログラムを作った経験があれば、「かなり簡単ですよね?」なんて言えないはずですけどね。 軽率な発言申し訳ございません。システムを作る段階からプレースホルダを使うようにすることを前提にしていました。そのため、すでにあるシステムに対策を施すことについていったわけではありませんでした ご回答ありがとうございました。

関連するQ&A