頻出高 ⏱ 6分 ★★★★☆

SQLインジェクション対策

攻撃の仕組みとプリペアドステートメントによる防御

ユーザー入力に悪意ある SQL コードを埋め込み、アプリケーションが意図しない SQL を実行させる攻撃。DB 破壊・情報漏洩・認証バイパスを引き起こす。

-- 危険: 入力を文字列連結でSQL組み立て
sql = "SELECT * FROM 顧客 WHERE 氏名 = '" + input + "'"

-- 入力が: ' OR '1'='1 の場合
-- 実行されるSQL:
SELECT * FROM 顧客 WHERE 氏名 = '' OR '1'='1'
-- → 全行が返される(認証バイパス)
-- 入力が: '; DROP TABLE 顧客; -- の場合
SELECT * FROM 顧客 WHERE 氏名 = '';
DROP TABLE 顧客;
-- → テーブルが削除される
-- はSQLのコメント。攻撃者はこれでSQL末尾を無効化するテクニックをよく使う。
-- プリペアドステートメントでパラメータを分離
PREPARE stmt FROM 'SELECT * FROM 顧客 WHERE 氏名 = ?';
EXECUTE stmt USING @input;

-- アプリ側(Java例)
PreparedStatement ps = conn.prepareStatement(
  "SELECT * FROM 顧客 WHERE 氏名 = ?");
ps.setString(1, userInput);  // 文字列として安全に扱われる
プリペアドステートメントはSQL構造を先に確定させ、入力値を「データ」として扱うため、SQLコードとして解釈されない。

📝 理解度チェック

SQLインジェクション対策として最も効果的なのはどれか?
' OR '1'='1 というSQLインジェクションの効果はどれか?

読了ボタンを押すとトップページの進捗に反映されます