演習課題「不正なバルクインサートを行う」
ユーザー"eve"としてログインし、存在しないユーザー"mikage"が"konnichiwa"と発言したレコードを挿入してください。
例えば、BBS上で、"eve"が"hack"と投稿すると次のようなSQL文が実行され、1つのレコードが挿入されます。
INSERT INTO bbs (user_name, content) values("eve","hack")'
投稿内容を工夫することで、以下のように複数のレコードをまとめて挿入するSQLを実行させてみてください。
INSERT INTO bbs (user_name, content) values("eve","hack"), ("mikage","konnichiwa")'
レコードの挿入後に採点ボタンで採点してください。
※ユーザーeveのログインパスワードは123です。
演習課題「投稿フォームのSQLインジェクション対策」
BBSへの投稿時にSQLインジェクションできないようにindex.phpの内容を修正してください。
※ユーザーeveのログインパスワードは123です。
#04:SQLインジェクションの対策をおこなう
デモサイトのPHPコードを修正して、SQLインジェクションの脆弱性への対策をおこないます。
この掲示板アプリの検索機能には、
・ユーザーの入力の先頭にダブルクォートが入ると、本来閉じるべきでないダブルクォートが閉じられてしまう
・ダブルクォートを閉じた後の文字列がSQLとして解釈されてしまう
という問題点がありました。
public_html/index.phpの33行目以降をつぎのように修正します。
(修正前) $query = 'SELECT id, content, user_name FROM bbs WHERE content like "%' . $keyword . '%"';
$sth = $pdo->query($query);
(修正後) $query = 'SELECT id, content, user_name FROM bbs WHERE content like :keyword';
$sth = $pdo->prepare($query);
$sth->bindValue(':keyword', '%' . $keyword . '%', PDO::PARAM_STR);
$sth->execute();
$query = 'SELECT id, content, user_name FROM bbs WHERE content like :keyword';
の :keyword は、「プレースホルダ」と呼ばれます。
ここでは、
・SQLのユーザーの入力によって決まる部分をプレースホルダに置き換えておく
・プレースホルダがユーザーの入力によって置き換わるときは、適切に記号のエスケープがおこなわれるようにする
という手順にすることで、不正なSQLが実行されるのを防止しています。