javascript文字リテラルのエスケープ方法
シングルクォートもきちんとエスケープする - 素人がプログラミングを勉強していたブログに触発されて。
こんなソースを
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>Hello</title> <script type="text/javascript"> //<![CDATA[ var data1 = "</script\><script\>alert(\"1\")</script\>]]\>"; //]]> </script> </head> <body> <a href="#" onclick="alert(data1);return false;">aaaa</a> </body> </html>
IE7、FireFox3、Opera9.2.6、safari3,chrome(beta)似て表示。
結果、すべてで
- ロード中、ロード後にアラートは表示されない。
- リンクをクリックすると"<script>alert("1")</script>\]\]>"と表示される。
を確認。
(閉じブラケットを二重にしたら表示されなかったヨ@はてな。バックスラッシュ入れてみたがどうだろう>だめだった。どうすりゃいいの?とりあえずバックスラッシュ+"]"にした)
結論
- \(バックスラッシュ、円記号)は2重(\\)に
- >(>)は \> に
- "(")は \" に
- 文字列をシングルクォーテーションで囲みたいなら'を \' に
- でもめんどくせーよ文字列は全部 " (ダブルクォーテーション)でくくろうよJSON仕様もそうだし
- 改行、復帰もそれぞれ \n \r にしよう
- 他制御コード(\t,\b,\f)も改行復帰と同じように
- 他の表示できない文字は捨てるか\unnnnにする。
(前提:すべてutf-8を使う)
さて、これをPHPで実装する方法は…どうやんの?
抜け、バグ、嘘、大げさな表現があれば指摘歓迎。