SQLインジェクションと対策方法

SQLインジェクションとは

MySQLの仕組み、構文を逆手に取り、意図しないSQL文が実行されてしまうことをいう。 対策をしないまま放置しておくと、ユーザー情報やパスワードを抜き取られてしまう原因にもなりとても危険だ。

例えば、

SELECT * FROM user_info WHERE name = '$username' AND password = '$userpass';

このようなコードが使用されていた場合、

$username : user1
$userpass : '' OR 'A' = 'A'

と入力すると、生成されるSQL文は

SELECT * FROM user_info WHERE name = 'user1' AND password = '' OR 'A' = 'A';

となってしまう。 これはどういうことになっているのかというと、

パスワードが’ ‘(空白)、もしくは’A’ = ‘A’(文字)でログイン出来てしまうことになる。

対策方法

方法の一つとして、プレースホルダを用いる事がある。

$sql = "SELECT * FROM user_info WHERE name= ? AND password= ? ";
        $stmt = $dbh->prepare($sql);
        $stmt->execute(array($username,$password));

nameとpasswordを?にする。この?がプレースホルダだ。 下にあるarrayコマンドで代入することにより、SQL文が成り立つ。