JQuery hile alıntı işaretlerini kodlamaz ve IE'de boşluk alanınızı keser.
Django'daki kaçış şablon etiketine dayanarak, zaten çok kullanılmış / test edildiğini tahmin ediyorum, gerekli olanı yapan bu işlevi yaptım.
Boşluk sıyırma sorunu için herhangi bir geçici çözümden muhtemelen daha basittir (ve muhtemelen daha hızlıdır) - ve sonucu örneğin bir öznitelik değeri içinde kullanacaksanız gerekli olan alıntı işaretlerini kodlar.
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 Güncellemesi:
En hızlı kaçış arayışında bir replaceAll
yöntemin bu uygulamasını buldum :
http://dumpsite.com/forum/index.php?topic=4.msg29#msg29
(buradan da bahsedilir: En hızlı) Dizedeki bir karakterin tüm örneklerini değiştirme yöntemi )
Bazı performans sonuçları burada:
http://jsperf.com/htmlencoderegex/25
replace
Yukarıdaki yerleşik zincirlere aynı sonuç dizesini verir . Birisi neden daha hızlı olduğunu açıklayabilirse çok mutlu olurum !?
Güncelleme 2015-03-04:
AngularJS'nin yukarıdaki yöntemi tam olarak kullandığını fark ettim:
https://github.com/angular/angular.js/blob/v1.3.14/src/ngSanitize/sanitize.js#L435
Birkaç ayrıntılandırma ekliyorlar - alfa sayısal olmayan tüm karakterleri varlıklara dönüştürmenin yanı sıra belirsiz bir Unicode sorunu ele alıyor gibi görünüyorlar. Belgeniz için belirlenmiş bir UTF8 karakter kümeniz olduğu sürece, ikincisinin gerekli olmadığı izlenimindeydim.
(4 yıl sonra) Django'nun hala bunlardan hiçbirini yapmadığını not edeceğim, bu yüzden ne kadar önemli olduklarından emin değilim:
https://github.com/django/django/blob/1.8b1/django/utils /html.py#L44
Güncelleme 2016-04-06:
Ayrıca eğik çizgiden kaçmak isteyebilirsiniz /
. Doğru HTML kodlaması için bu gerekli değildir, ancak OWASP tarafından bir anti-XSS güvenlik önlemi olarak önerilir . (bunu yorumlarda önerdiği için @JNF'ye teşekkürler)
.replace(/\//g, '/');