こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

PHPでMySQLを操作しています。

PDOのprepare()を使えば(プレースホルダを使えば?)、SQLインジェクションは必ず発生しないと言えますか?

もし、そうだとすれば、SQLインジェクション対策はかなり簡単ですよね?でも、セキュリティの話でよく取り上げられるということは、実際は他の問題が発生したりするんですかね?

投稿日時 - 2014-09-14 21:58:33

QNo.8754645

困ってます

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

少し古いドキュメントですが、一読をおすすめします。

安全なSQLの呼び出し方 - 情報処理推進機構
http://www.ipa.go.jp/files/000017320.pdf

MySQLの場合はデータベースへの接続方法によっては、
DBMSへ引き渡す前に変数とクエリが結合されてしまうようです。(動的プレースホルダ)
そして残念なことに、この接続方法がデフォルトになっているようです。

そして、上記のドキュメントには、次のように記述されています。
----------------------------------------------------------------------------------
静的プレースホルダは、SQLを準備する段階でSQL文の構文が確定し、あとからSQL構文が変化することがないため、SQLインジェクションの脆弱性が生じません。
それに対して、動的プレースホルダは、バインド処理を実現するライブラリの実装に問題があると、SQL構文が変化する可能性があり、SQLインジェクションの脆弱性が生じる可能性を否定できません。

投稿日時 - 2014-09-15 00:39:23

お礼

ご回答ありがとうございます

ざっと読んだところ、静的プレースホルダを利用すれば、仕組み上SQLインジェクションが発生しなことがわかりました。

どうすれば、静的プレースホルダを利用できるか、利用できないなら、もう一度「安全なSQLの呼び出し方」をよんで適切なエスケープ処理を勉強します

投稿日時 - 2014-09-15 07:59:03

このQ&Aは役に立ちましたか?

9人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

>>PDOのprepare()を使えば(プレースホルダを使えば?)、SQLインジェクションは必ず発生しないと言えますか?

現時点では、発生しないといえるでしょう。ただ、創意工夫して、それを可能にする方法を将来思いつく方がいるかもしれませんけどね。

>>もし、そうだとすれば、SQLインジェクション対策はかなり簡単ですよね?

実際にプログラムを作った経験があれば、「かなり簡単ですよね?」なんて言えないはずですけどね。
対策と修正にかかるお金、それにかかる時間、修正時のバグ混入への対策とテストなどを考えると、その「かなり簡単なこと」ができないサイトが多いから、現時点でも同様なサイバー攻撃を受けて、それが成功するサイトがあるのだと思います。

>>実際は他の問題が発生したりするんですかね?

もちろん、他のセキュリティホールになる部分が沢山あると思います。攻撃側は、そういうセキュリティホールの情報共有を犯罪者仲間と行い、スキルアップしつつ、情報・技術蓄積の精進を通じて、侵入の成功率をアップする努力を日々続けているのだと思っています。

投稿日時 - 2014-09-14 22:51:39

お礼

>>実際にプログラムを作った経験があれば、「かなり簡単ですよね?」なんて言えないはずですけどね。

軽率な発言申し訳ございません。システムを作る段階からプレースホルダを使うようにすることを前提にしていました。そのため、すでにあるシステムに対策を施すことについていったわけではありませんでした

ご回答ありがとうございました。

投稿日時 - 2014-09-15 07:49:26

あなたにオススメの質問