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

webアプリケーションでデータベースとのやり取りをする際、気を付けなければならないのはSQLインジェクションである。 POSTで以下のSQL文のusernameに入力を入れるとする。

SELECT * FROM user_info WHERE name = username 
#user1と入力したら以下のようになる
SELECT * FROM user_info WHERE name = 'user1' 

この時、 ’OR’A’=’A  と入力されるとSQL文は以下のようになり、条件を満たしてしまう。

SELECT * FROM user_info WHERE name = ''OR'A'='A'

これがSQLインジェクションである。 SQLインジェクションの対策としてプレースホルダというものがある。 これは入力された文字列をそのまま入れるのではなく、最後に値として入れる方法で、これによりSQLインジェクションを防ぐことができる。 以下にプレースホルダの例を示す。

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

もし2つ以上入力したいときはその数 ? を入れることでできる。この時のexecuteの括弧の中は配列にすればよい。