変数で組み立てたSQL(SQLインジェクション)
なぜ危険か
入力をSQLに直接連結すると、攻撃者がクエリ自体を書き換え、データベースのあらゆるデータを読み取り・変更・削除できます。プリペアドステートメントはクエリと値を別々に送るため、入力がSQLになることはありません。
$id = $_GET['id'];
$rows = $db->query("SELECT * FROM users WHERE id = $id");
$stmt = $db->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([$_GET['id']]);
$rows = $stmt->fetchAll();
対策
プリペアドステートメントを使用:$db->prepare('... WHERE id = ?') の後 execute([$id])。
コードを検査する
コードを検査する →
ファイルを貼り付けると、このルールに該当する行をすべて示します。