ITトレメ「PHP技術者認定・上級」の42問目は「JavaScriptインジェクションが可能となるスクリプトとして、正しいものを1つ次の記述の中から選択せよ」という問題だ。
正しい答は:
<?php $v = strip_tags($_GET['param'], '<a>'); var_dump($v); ?>
とされている。しかし:
<?php $v = filter_var($_GET['param'], FILTER_VALIDATE_EMAIL); var_dump($v); ?>
も「JavaScriptインジェクションが可能」ではないだろうか。
たとえば Does PHP's FILTER_VALIDATE_EMAIL provide adequate security? - Stack Overflow に示されている「"<script>alert('xss')</script>"@example.com」が $_GET['param'] に渡ったらどうなるだろう。
というようなメールを関係先に送ってみた。
そもそも var_dump 時に、エスケープ漏れを気にする必要はないと思う。
追記(2014-09-03)
PHP技術者認定機構の理事長・吉松氏が5月に書かれた記事によると、「ITトレメの上級試験問題の廃止を決めました」とのこと。残念だが、そのうち非公開となるのだろう。
『徹底攻略PHP5技術者認定[上級]試験問題集[PJ0-200]対応』を購入したので、そこでも誤りと思われる問題が見つかったら、また報告します。