PHPのプリペアドステートメントで実行させるSQLを確認してみた
PHPでユーザ入力値を使ってDB操作をする際に、プリペアドステートメントを使うと安全だ。
と色んなサイトに載っています。
実際にPHPマニュアルにも明記されています。
アプリケーションで明示的にプリペアドステートメントを使用するように すれば、SQL インジェクションは決して発生しません (しかし、もし信頼できない入力をもとにクエリの他の部分を構築している のならば、その部分に対するリスクを負うことになります)。
今回はプリペアドステートメントで実際に実行させるSQLをクエリログ上で確認したいと思います。
SQLインジェクションとは
SQLインジェクションとは悪意のあるユーザから入力フィールドなどから、
アプリケーションが想定しないSQL文を実行させることにより、データベースシステムを不正に操作する攻撃の事です。
例えば、以下の様なSQLがあったとして、
SELECT * FROM login WHERE pass='abcde'
abcdeの部分をユーザ入力値から取得している場合、次の様な値を入力フォームに入れられると問題が生じる。
' or 'A' = 'A
と入力されると、
SELECT * FROM login WHERE pass='' or 'A' = 'A'
というSQLが発行され、loginテーブルの内容が全て表示されてしまいます。
プリペアドステートメントはこれの対処法です。