10. SQLインジェクション対策
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
];
$pdo = new PDO($dsn, $user, $password, $options);
$id = $_POST['id']
$prepare = $pdo->prepare("SELECT * FROM user WHERE id=" . $id . ";");
$prepare = $pdo->prepare("SELECT * FROM user WHERE id=:id;");
$prepare->bindValue('id', $id, PDO::PARAM_INT);
または↓
$prepare = $pdo->prepare("SELECT * FROM user WHERE id=?;");
$prepare->bindParam('1', $id, PDO::PARAM_INT);
PHP7.4 : PDOモジュールを使う場合
例外をスローする設定
クエリ設定の部分推奨の例
クエリ設定の部分悪い例
11. SQLインジェクション対策
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
];
$pdo = new PDO($dsn, $user, $password, $options);
$id = $_POST['id']
$prepare = $pdo->prepare("SELECT * FROM user WHERE id=" . $id . ";");
$prepare = $pdo->prepare("SELECT * FROM user WHERE id=:id;");
$prepare->bindValue('id', $id, PDO::PARAM_INT);
または↓
$prepare = $pdo->prepare("SELECT * FROM user WHERE id=?;");
$prepare->bindParam('1', $id, PDO::PARAM_INT);
文字エンコードの設定を忘れずに... charset=utf8mb4
PHP7.4 : PDOモジュールを使う場合
権限を絞ったユーザを作成して、かならずパスワードを設定する
たとえば...
CREATE USER 'pdo_user'@'localhost' IDENTIFIED BY 'password';
GRANT ALL ON pdo_test.* to 'pdo_user'@'localhost';
12. SQLインジェクション対策
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
];
$pdo = new PDO($dsn, $user, $password, $options);
$id = $_POST['id']
$prepare = $pdo->prepare("SELECT * FROM user WHERE id=" . $id . ";");
$prepare = $pdo->prepare("SELECT * FROM user WHERE id=:id;");
$prepare->bindValue('id', $id, PDO::PARAM_INT);
または↓
$prepare = $pdo->prepare("SELECT * FROM user WHERE id=?;");
$prepare->bindParam('1', $id, PDO::PARAM_INT);
静的プレースホルダを使う設定
bindValue関数またはbindParam関数で値の型(PARAM_*)を指定してをバインド
PHP 7.4 : PDOモジュールを使う場合
クエリを文字列連結で入れるのはダメ!