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]対応』を購入したので、そこでも誤りと思われる問題が見つかったら、また報告します。