攻撃の仕組みとプリペアドステートメントによる防御
ユーザー入力に悪意ある 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 顧客; -- → テーブルが削除される
-- プリペアドステートメントでパラメータを分離 PREPARE stmt FROM 'SELECT * FROM 顧客 WHERE 氏名 = ?'; EXECUTE stmt USING @input; -- アプリ側(Java例) PreparedStatement ps = conn.prepareStatement( "SELECT * FROM 顧客 WHERE 氏名 = ?"); ps.setString(1, userInput); // 文字列として安全に扱われる
読了ボタンを押すとトップページの進捗に反映されます