Yanıtlar:
Belgenize metin içeriği beklendiği bir yere metin içeriği ekliyorsanız 1 , genellikle yalnızca XML'de kullandığınız karakterlerden kaçmanız gerekir . Bir öğenin içinde, bu sadece varlık kaçış işareti &
ve öğe sınırlayıcısını işaretlerden daha küçük ve daha büyük içerir <
>
:
& becomes &
< becomes <
> becomes >
Özellik değerlerinin içinde, kullandığınız tırnak işaretinden de kaçmanız gerekir:
" becomes "
' becomes '
Bazı durumlarda bu karakterlerden bazılarını atlamak güvenli olabilir, ancak hata yapma olasılığını azaltmak için her durumda beşten de kaçmanızı öneririm.
Belge kodlamanız, ASCII kodlu bir belgede emoji kullanmaya çalışıyorsanız, kullandığınız tüm karakterleri desteklemiyorsa, bunlardan da kaçmanız gerekir. Günümüzde çoğu belge, bunun gerekli olmayacağı yerlerde tamamen Unicode destekleyen UTF-8 kodlaması kullanılarak kodlanmıştır.
Genel olarak, boşluklardan kaçmamalısınız
.
normal bir alan değil, kırılmaz bir alan . Normal sözcükler yerine bunları, iki sözcük arasına satır sonu eklenmesini önlemek veya otomatik olarak daraltılmadan fazladan boşluk eklemek için kullanabilirsiniz, ancak bu genellikle nadir görülen bir durumdur. Bunu gerektiren bir tasarım kısıtlamanız yoksa bunu yapmayın.
1 "Metin içeriğinin beklendiği bir konum" ile, normal ayrıştırma kurallarının geçerli olduğu bir öğenin veya alıntılanmış öznitelik değerinin içini kastediyorum. Örneğin: <p>HERE</p>
veya <p title="HERE">...</p>
. Yukarıda yazdıklarım , kodun veya stil etiketinin içi gibi özel ayrıştırma kuralları veya anlamları olan veya bir öğe veya özellik adı gibi içerikler için geçerli değildir . Örneğin: <NOT-HERE>...</NOT-HERE>
, <script>NOT-HERE</script>
, <style>NOT-HERE</script>
ya da <p NOT-HERE="...">...</p>
.
Bu bağlamlarda, kurallar daha karmaşıktır ve bir güvenlik açığı oluşturmak çok daha kolaydır. Bu konumların herhangi birine dinamik içerik eklemenizi kesinlikle tavsiye etmiyorum. Yetkili güvenlik bilincine sahip geliştiricilerden oluşan ekiplerin, bu değerleri doğru bir şekilde kodladıklarını, ancak önemli bir durumu eksik olduklarını varsayarak güvenlik açıkları yarattığını gördüm. Genellikle dinamik değeri bir özniteliğe koymak ve ardından JavaScript ile kullanmak gibi daha güvenli bir alternatif vardır.
Gerekirse , aklınızda bulundurmanız gereken bazı endişeleri anlamanıza yardımcı olması için lütfen Açık Web Uygulaması Güvenlik Projesi'nin XSS Önleme Kurallarını okuyun .
Bağlama bağlıdır. HTML'deki bazı olası bağlamlar:
OWASP'ın Siteler Arası Komut Dosyası Önleme Hile Sayfasına , özellikle de " Neden HTML Varlığını Güvenilmeyen Verileri Kodlayamıyorum? " Ve " XSS Önleme Kuralları " bölümlerine bakın. Ancak, belgenin tamamını okumak en iyisidir.
Temel olarak, HTML ve XML dosyalarınızda her zaman kaçması gereken üç ana karakter vardır, bu nedenle işaretlemelerin geri kalanıyla etkileşime girmezler, bu nedenle muhtemelen beklediğiniz gibi ikisi, sözdizimi sarmalayıcıları olacaktır. >, aşağıdaki gibi listelenir:
1) < (<)
2) > (>)
3) & (&)
Ayrıca çift tırnak (")" ve tek tırnak (') & apos
Dinamik içeriği <script>
ve içine koymaktan kaçının. <style>
Bu kurallar onlar için geçerli değildir. Örneğin, a'ya JSON eklemeniz gerekiyorsa, JSON serileştirmeden sonra <ile \ x3c, U + 2028 karakterini \ u2028 ve U + 2029 ile \ u2029 ile değiştirin.)
HTML Kaçış Karakterleri: Tam Liste: http://www.theukwebdesigncompany.com/articles/entity-escape-characters.php
Bu nedenle, <veya & karakterinden sonra karakter referansına başlayabilecek herhangi bir şeyden kaçmanız gerekir. Ayrıca ve işaretleri üzerindeki kural, alıntı yapılan öznitelikler için tek kuraldır, çünkü eşleşen tırnak işareti birini sonlandıracak tek şeydir. Ancak, burada özellik değerini sonlandırmak istemiyorsanız, tırnak işaretinden kaçın.
UTF-8'e geçmek dosyanızı yeniden kaydetme anlamına gelir:
Sayfanız için UTF-8 kodlamasını kullanan karakter kullanmak, çoğu kaçışa gerek duymamanız ve sadece karakterlerle çalışmanız anlamına gelir. Ancak, belgenizin kodlamasını değiştirmek için, yalnızca sayfanın üst kısmındaki veya sunucudaki kodlama bildirimini değiştirmeniz yeterli değildir. Belgenizi bu kodlamaya yeniden kaydetmeniz gerekir. Bunu uygulamanızla nasıl yapacağınızı anlamanıza yardımcı olması için Web yazma uygulamalarında kodlamayı ayarlama bölümünü okuyun.Görünmez veya belirsiz karakterler:
Kaçışlar için özellikle yararlı bir rol, sunumda görünmez veya belirsiz olan karakterleri temsil etmektir.
Bir örnek Unicode karakteri U + 200F SAĞ-SOL MARK olabilir. Bu karakter, çift yönlü metindeki yönlülüğü açıklığa kavuşturmak için kullanılabilir (örn. Arapça veya İbranice komut dosyaları kullanılırken). Bununla birlikte, grafik formu yoktur, bu nedenle bu karakterlerin metinde nerede olduğunu görmek zordur ve kaybedilir veya unutulursa, daha sonraki düzenleme sırasında beklenmedik sonuçlar oluşturabilirler. Bunun yerine (veya sayısal karakter referans eşdeğeri) kullanılması, bu karakterlerin fark edilmesini kolaylaştırır.
Belirsiz bir karaktere örnek olarak U + 00A0 NO-BREAK SPACE verilebilir. Bu alan türü satır kesmeyi önler, ancak karakter olarak kullanıldığında diğer alanlara benziyor. Kullanmak, bu tür boşlukların metinde nerede göründüğünü oldukça netleştirir.
Kesin cevap bağlama bağlıdır. Genel olarak, bu karakterler bulunmamalıdır ( HTML 5.2 §3.2.4.2.5 ):
Metin düğümleri ve nitelik değerleri Unicode karakterlerden oluşmalı, U + 0000 karakter içermemeli, kalıcı olarak tanımlanmamış Unicode karakterler (karakter olmayan) içermemeli ve boşluk karakterleri dışındaki kontrol karakterlerini içermemelidir. Bu belirtim, kesin bağlamlarına bağlı olarak Metin düğümlerinin tam değeri ve özellik değerlerinde ek kısıtlamalar içerir.
HTML'deki öğeler için, Metin içerik modelinin kısıtlamaları da öğenin türüne bağlıdır. Örneğin, textarea öğesinin içindeki bir "<" öğesinin HTML'de kaçmasına gerek yoktur, çünkü textarea kaçabilir bir ham metin öğesidir.
Bu kısıtlamalar şartname boyunca dağılmıştır. Örneğin, öznitelik değerleri ( §8.1.2.3 ) belirsiz ve işareti içermemeli ve (i) boş, (ii) tek tırnak içinde (ve dolayısıyla U + 0027 APOSTROPHE karakteri içermemelidir '
), (iii) çift tırnak içinde ( U + 0022 QUOTATION MARK karakteri içermemelidir "
) veya (iv) alıntılanmamış - aşağıdaki kısıtlamalarla:
... değişmez boşluk karakteri, U + 0022 TEKLİF MARK karakteri ("), U + 0027 APOSTROPHE karakteri ('), U + 003D EQUALS SIGN karakteri (=), U + 003C DAHA AZ İŞARET karakteri ( <), U + 003E GREATER-THAN SIGN karakterleri (>) veya U + 0060 GRAVE ACCENT karakterleri (`) ve boş dize olmamalıdır.
<p onclick="NOT-HERE">...</p>
ve<p style="NOT-HERE">...</p>
.