kohanaのテスト4の続き・・・XSS攻撃に対する穴が空いていた
昨日のテスト4のサンプルコードなんですが、SQLインジェクション対策がちゃんと出来たので満足していたら、何と XSS(Cross-Site Scripting)攻撃に対する脆弱性が存在しました。ユーザの入力値 $_POST に対しては test3post.php で htmlspecialchars() 関数を使って HTML エスケープしているので大丈夫と思っていたら、データベースからの返り値をテーブル表示する test4table.php に穴がありました。
住所の欄に「<script javascript 」なんて書いて送ると、テーブルの表示途中でPHPが止まってしまいます。このページが使い物にならなくなる、要するにサイトが壊れちゃうってことですね。データベースからの返り値も元を正せばユーザーの入力値ですから、ちゃんと対策が必要なんだと実感した次第です。
とういことで、test4table.php の XSS 対策版サンプルコードです。
・application/views/test4table.php の対策版
<html> <body> <table border="1"><tr> <?PHP foreach ($data as $d) { $id = HTML::chars($d['id']); $name = HTML::chars($d['name']); $address = HTML::chars($d['address']); $tel = HTML::chars($d['tel']); print "<tr><td>$id</td> <td>$name</td> <td>$address</td> <td>$tel</td></tr>"; } ?> </tr></table> </body> </html>
プログラミングでいろいろと試行錯誤するのは楽しいですね。壮大なパズルを紐解いているような感じがします。