記事の訂正: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しなくてもよいということも補足させて頂きます。
書き方にまだ不備がある、正確ではない、という方もおられると思うので、ご指摘頂ければ随時追記していきます。
尚、本件ははてなブックマークにて高木浩光先生にご指摘を頂きました。ありがとうございました。
関連エントリ
最新のブログ記事(新着順)
- CSSのみで実装された500種類のローディングアニメーション「CSS Loaders」
- 画像ホバーで様々なエフェクトをかけられる「Izmir」
- CSSのbox-shadowをGUIで生成できる「CSS Box Shadows Generator」
- 好きな画像や文字を埋め込んだQRコードをリアルタイムで作れるWEBツール
- 約7500種の汎用ピクトグラムアイコン集「Phosphor Icons」
- ほぼCSSで実装されたUIフレームワーク「Ellegant CSS」
- TailwindCSSベースの150種類以上のUIライブラリ「SailboatUI」
- 1700種類以上のSVGアイコン「MingCute Icon」
- 2000種類以上の汎用ピクトグラムアイコン集「Atlas Icons」
- かわいい手書き風フォント「うさぎとまんげつのサンセリフ」
- 過去のエントリ