【PHP】【MySQL】PDO・SQLインジェクション対策

◼︎PDOとは
PHP標準のデータベース接続クラスのこと。
PHPでは標準でMySQLとかSQLiteなどの色々なデータベースに接続するための命令が用意されているので、分岐させてメソッド呼べば複数のデータベースに対応することができる。

しかし、PDOだと同じ命令で複数のデータベースに接続することができる。

◼︎SQLインジェクション
SQLインジェクションとは、エラーになr内容に不正なSQL文を含めてリクエストを送り、本来の処理とは異なる命令をデータベースに実行させることが出来る脆弱性のこと。

対策
プレースホルダが挙げられる。プレースホルダとはSQL中に後に可変値を埋め込みたい場所を「$1」とか「?」などの特別な文字列を入れてSQL本体とは切り離すことができるもの。SQLサーバはパラメータの内容はあくまでも「値」として解釈するので、SQLとして解釈できる文字列が入っていてもSQLとして実行することはしないという仕組み。

<?php
$sql = "INSERT IGNORE INTO shop (name, excerpt, content, thumbnailUrl, imageUrl, link, latitude, longitude) ". 
	" VALUES (?, ?, ?, ?, ?, ?, ?, ?)";?数は文字列投入数です
$stmt = $pdo->prepare($sql);
$stmt->execute(array($_POST['name'], $_POST['excerpt'], $_POST['content'],
$_POST['thumbnailUrl'], $_POST['imageUrl'], $_POST['link'], $_POST['latitude'], $_POST['longitude']));
?>

おまけ
◼︎insert ignore into
テーブルの既存の PRIMARY または UNIQUE キーと重複するレコードはすべて無視され、挿入されない
idとかを主キーに設定すること。