前の記事 ≪:携帯向け自動変換用Apacheモジュール「mod_chxj」がバージョンアップ
次の記事 ≫:Web2.0風なサイトを作る過程のPhotoShopチュートリアル

記事の訂正:PHPのhtmlspecialcharsにはENT_QUOTESを付ける

2008年04月16日-はてなブックマーク

スポンサード リンク
[PR] 英単語を忘却曲線アプリを使って超効率よく記憶する方法

PHPのhtmlspecialcharsにはENT_QUOTESを付ける」という記事において誤りがありましたので訂正です。
私が紹介した、エスケープしたつもりの、次のコードは、document.cookie がアラートされてしまいます。

問題のケース
$str = "');alert(document.cookie+'";
$str = htmlspecialchars($str, ENT_QUOTES);

$smary->assign("assigned", $str); // $smarty はSmartyオブジェクト

----以下、Smartyテンプレート----
<a href="http://phpspot.net/php" onclick="javascript:alert('{$assigned}');">test</a>

htmlspecialchars($str, ENT_QUOTES); しているんですが、alert(''); 内の文字列で、&#039; は ' として解釈されてしまうようで、1回空文字のalertを表示した後にdocument.cookieが表示されてしまいます。つまり、onclick="javascript:alert('&#039;);alert(document.cookie+&#039');" であるのにも関わらず、onclick="javascript:alert('');alert(document.cookie+'');" が解釈されてしまいます。

これを防ぐためには、' を &#039; にするのではなく、' → \' というのが正しい方法のようです。
PHPではaddslashes関数を使えばよさそうです。

次のように、onclickの値がassignedのような場合は問題ないです。javascriptに渡る文字列として渡す場合は注意が必要のようですね。

大丈夫なケース
$str = "');alert(document.cookie+'";
$str = htmlspecialchars($str, ENT_QUOTES);

$smary->assign("assigned", $str); // $smarty はSmartyオブジェクト

----以下、Smartyテンプレート----
<a href="http://phpspot.net/php" onclick="{$assigned}">test</a>

htmlspecialchars($str, ENT_QUOTES) しておけば安心という覚え方は誤りで、私の思い込みと勘違いで誤った認識をされてしまった方々に深くお詫びいたします。
また、smartyに関しては、escape関数によってエスケープすればENT_QUOTESしなくてもよいということも補足させて頂きます。

書き方にまだ不備がある、正確ではない、という方もおられると思うので、ご指摘頂ければ随時追記していきます。
尚、本件ははてなブックマークにて高木浩光先生にご指摘を頂きました。ありがとうございました。

関連エントリ

スポンサード リンク

By.KJ : 2008年04月16日 20:00 livedoor Readerで購読 Twitterに投稿

間違いの指摘をしていただける方はメール、あるいはTwitter/FBでお願いします(クリック)