記事の訂正:PHPのhtmlspecialcharsにはENT_QUOTESを付ける
2008年04月16日
「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(''); 内の文字列で、' は ' として解釈されてしまうようで、1回空文字のalertを表示した後にdocument.cookieが表示されてしまいます。つまり、onclick="javascript:alert('');alert(document.cookie+'');" であるのにも関わらず、onclick="javascript:alert('');alert(document.cookie+'');" が解釈されてしまいます。
これを防ぐためには、' を ' にするのではなく、' → \' というのが正しい方法のようです。
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しなくてもよいということも補足させて頂きます。
書き方にまだ不備がある、正確ではない、という方もおられると思うので、ご指摘頂ければ随時追記していきます。
尚、本件ははてなブックマークにて高木浩光先生にご指摘を頂きました。ありがとうございました。
関連エントリ
投稿者 KJ : 2008年04月16日 20:00
|
![]()
間違いの指摘をしていただける方はメールでお願いします
最新のブログ記事
- 2008年8月29日 管理人のブックマーク
- 全キャリア対応のデコメールの作成・変換が可能なPHPライブラリ「Qdmail」
- プロフェッショナルなノートパソコンの広告風画像を作る流れ
- 歯車や雲、人型など実用的なPhotoshopブラシ集
- 2008年8月28日 管理人のブックマーク
- オープンソースの便利PHPスクリプトまとめサイト「Open Source PHP」
- 表示法が新しくセクシーなLightBox「SexyLightBox」
- 背景画像やテクスチャ画像のリソース13サイト
- 2008年8月27日 管理人のブックマーク
- Ajaxベースのクールなショッピングカート作成
- WEBで好きな曲を共有可能な音楽共有オープンソース「Opentape」


















