追記:新しくより安全なバージョンはこちらです。
hoshikuzuさんのページに書いてあるJavaScript文字列のエスケープ方法です。(元ネタのメールアーカイブは文字が欠落)
http://d.hatena.ne.jp/hoshikuzu/20071011#p1
1. 「¥」を「¥¥」に置換する
2. 「”」を「¥”」に置換する
3. 「’」を「¥’」に置換する
4. 「/」を「¥/」に置換する
5. 「<」を「x3c」に置換する
6. 「>」を「x3e」に置換する
7. 「0x0D(CR)」を「¥r」に置換する
8. 「0x0A(LF)」を「¥n」に置換する
SmartyのJavaScirpt文字列のエスケープ方法です。
CVS版:2007/10/12
case ‘javascript’:
// escape quotes and backslashes, newlines, etc.
return strtr($string, array(‘\\’=>’\\\\’,”‘”=>”\\'”,'”‘=>’\\”‘,”\r”=>’\\r’,”\n”=>’\\n’,'</’=>'<\/’));
strtrで置換しているので元々文字エンコーディング攻撃に脆弱ですが、クローズタグだけ考慮している部分、/、<、>の取扱いが異なります。<, >はHEXで表記した方が安全ですね。
文字エンコーディングの問題は随分前から気づいていましたが、この手の修正は受け入れられる可能性が低いですからね…(文字エンコーディングが壊れていなければほとんどの文字エンコーディングで大丈夫なはず。例外はSJISかな)いずれにせよJavaScriptをダイナミックに生成するのはお勧めしません…
JavaScriptはクライアントサイドなので、確実かつ安全なエスケープ方法、は簡単ではありませんから。