jQueryのトリックは引用符をエンコードせず、IEでは空白を削除します。
すでに頻繁に使用/テストされていると思われるDjangoのエスケープテンプレートタグに基づいて、必要なことを実行するこの関数を作成しました。
これは、空白を削除する問題のどの回避策よりも間違いなく簡単(そしておそらく高速)です-引用符をエンコードします。これは、たとえば属性値内で結果を使用する場合に不可欠です。
function htmlEscape(str) {
return str
.replace(/&/g, '&')
.replace(/"/g, '"')
.replace(/'/g, ''')
.replace(/</g, '<')
.replace(/>/g, '>');
}
// I needed the opposite function today, so adding here too:
function htmlUnescape(str){
return str
.replace(/"/g, '"')
.replace(/'/g, "'")
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/&/g, '&');
}
更新2013-06-17:
最速のエスケープを検索して、replaceAll
メソッドのこの実装を見つけました:
http
://dumpsite.com/forum/index.php?topic=4.msg29#msg29
(ここでも参照:最速文字列内の文字のすべてのインスタンスを置き換えるメソッド)
ここでいくつかのパフォーマンス結果:http:
//jsperf.com/htmlencoderegex/25
上記の組み込みreplace
チェーンと同じ結果文字列が得られます。なぜ速いのか誰かに説明してもらえたら嬉しいです!?
アップデート2015-03-04:
AngularJSが上記の方法を正確に使用していることに気づきました:
https ://github.com/angular/angular.js/blob/v1.3.14/src/ngSanitize/sanitize.js#L435
それらはいくつかの改良を加えます-それらはあいまいなUnicodeの問題を処理しているだけでなく、すべての英数字以外の文字をエンティティに変換しているように見えます。ドキュメントにUTF8文字セットが指定されている限り、後者は必要ないという印象を受けました。
(4年後)Djangoはまだこれらのことを行っていないので、それらがどれほど重要かはわかりません:
https ://github.com/django/django/blob/1.8b1/django/utils /html.py#L44
更新2016-04-06:
スラッシュをエスケープすることもできます/
。これは正しいHTMLエンコーディングには必要ありませんが、OWASPではXSS対策の安全対策として推奨されています。(コメントでこれを提案してくれた@JNFに感謝します)
.replace(/\//g, '/');