SQLインジェクション

SQLインジェクションとは

SQLインジェクションはSQL文に意図しない命令を挿入することで成立します。その結果、データベース内に保存されているデータの改ざんや漏出を招きます。

攻撃される場所

適切にエスケープされてないフォームなど。

対処法

SQLインジェクションに対しても基本的にSQL文(命令文)のエスケープとなります。PostgreSQLでは「pg_escape_string()」、MySQLでは「mysql_real_escape_string()」関数を使いますが、MySQLのmysql_real_escape_string()関数はPHP7以降で削除されました。従って、現在ではプログラム側のエスケープが不要になるプリペアドステートメントをできる限り利用されることが推奨されています。また、PHPではこれを利用するために、PDOと呼ばれる専用のクラスを使います。

プリペアドステートメントとは

プリペアドステートメントとは事前に色々用意して実行時に条件や値が異なればそこを入れ替えたりする機能を言います。プリペアドステートメントを使うことで事前にプログラム側でエスケープする必要がなくなり、エスケープ漏れを防ぐことができます。

PDOとは

PHPでプリペアドステートメントを使う場合、PDOと呼ばれる専用のクラスを使います。PDOとはPHPと各種データベースの間に入って同じ命令でデータベースへアクセスできるように作られたクラスのことです。「PHP Data Object」と表記され、PHP5.1.0から実装されました。かつてはMySQLであればmysql_connect関数、PostgreSQLであればpg_connect関数といったようにそれぞれ指定された関数を使わなければ接続できませんでした。しかし、PDOの登場によって一つの関数で複数のデータベースへアクセスできるようになった訳です。データベース抽象化レイヤクラスとも言われます。