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文が成り立つ。