dari88's diary

これから趣味にするプログラミング/PHP/javascript/kohana/CMS/web design/

kohanaのテスト4の続き・・・XSS攻撃に対する穴が空いていた

昨日のテスト4のサンプルコードなんですが、SQLインジェクション対策がちゃんと出来たので満足していたら、何と XSS(Cross-Site Scripting)攻撃に対する脆弱性が存在しました。ユーザの入力値 $_POST に対しては test3post.php で htmlspecialchars() 関数を使って HTML エスケープしているので大丈夫と思っていたら、データベースからの返り値をテーブル表示する test4table.php に穴がありました。

住所の欄に「<script javascript 」なんて書いて送ると、テーブルの表示途中でPHPが止まってしまいます。このページが使い物にならなくなる、要するにサイトが壊れちゃうってことですね。データベースからの返り値も元を正せばユーザーの入力値ですから、ちゃんと対策が必要なんだと実感した次第です。

とういことで、test4table.phpXSS 対策版サンプルコードです。

・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>

 プログラミングでいろいろと試行錯誤するのは楽しいですね。壮大なパズルを紐解いているような感じがします。