記事の訂正: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しなくてもよいということも補足させて頂きます。
書き方にまだ不備がある、正確ではない、という方もおられると思うので、ご指摘頂ければ随時追記していきます。
尚、本件ははてなブックマークにて高木浩光先生にご指摘を頂きました。ありがとうございました。
関連エントリ
最新のブログ記事(新着順)
- 個性的な明朝フリーフォント「築豊初号明朝OFL」
- CSSで太陽が差し込むようなアニメーション実装
- 可愛くアニメーションする「beautifully crafted animated icons」
- アイソメトリックなアイコンがアイコンがPNG,SVGでゲットできる「Isoicons」
- ユニークなカタカナフォントtorisippo
- 美しいメッシュグラデーションをCSSで簡単に取得できる「MSHR」
- TailwindCSSなサイトで使える100以上のアニメーションエフェクト「animata」
- SVG形式のテック系企業のロゴを簡単にゲットできる「Svgl」
- 統一感のある色味を一括生成できるツール「The good colors」
- くちばしフォント【商用可】
- 過去のエントリ