前の記事 ≪:カラー写真を新聞紙に掲載された写真のようにするチュートリアル
次の記事 ≫:ヤフー、「OpenID」発行サービスを開始

PHPのhtmlspecialcharsにはENT_QUOTESを付ける

2008年01月31日-はてなブックマーク

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

htmlspecialchars ( ) でセキュリティ対策( ENT_QUOTES もね!)

PHPのhtmlspecialcharsにはENT_QUOTESを付ける。
htmlspecialchars でXSS対策をしていたと思ったら、デフォルトでは シングルクオートをエスケープしてくれない(マニュアル参照)

htmlspecialchars($str, ENT_QUOTES);

ENT_QUOTES を指定することで、シングルクオートも ' にエスケープ出来ます。
ZAPAブロ〜グのZAPAさんの指摘するh関数を定義してフレームワークなどに組み込んでおくのがスマートなのかもしれませんね→htmlspecialchars関数を簡単にする

意外に知られていないかもしれないので、念をのため紹介しておきます。(知っている人はごめんなさい)

その危険な例をしめしてみます。
例えば、htmlspecialchars した値は安全だとして、Smarty などで次のように値を割り当てたとすると危険です。

<a href="http://phpspot.net/php" onclick="javascript:alert('{$assigned}');">test</a>

例えば、$assigned 変数に、「');alert(document.cookie+'」なんていう値がはいっていたらcookieがalertされてしまいます。
<>だけエスケープしておけば大丈夫、ということはいえなくなってしまいます。

というわけで、htmlspecialcharsを使う際にはENT_QUOTESを第二引数に渡さないといけません。

上記は誤りなので訂正いたします。(2008/04/16)
追記訂正) alert関数の呼び出しで、alert('&#039;);alert(document.cookie+&#039;'); だと document.cookie がアラートされてしまいます。
javascript 関数の文字列内のエスケープを行う際、シングルクオートは、\' のようにエスケープする必要があります。addslashes 関数などを使って ' → \' にする必要があるようです。
詳しくは、追記エントリにて。

関連エントリ

関連の記事検索:PHP, セキュリティ, xss
スポンサード リンク

By.KJ : 2008年01月31日 10:05 livedoor Readerで購読 Twitterに投稿

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