HTML'de <, > ve & karakterlerinin özel bir anlamı vardır ve escape edilmeleri gerekir. Türkçe için asıl ilginç sorun bu dört karakterde değil, Türkçenin ünlü "noktalı/noktasız I" probleminin escape işlemiyle nasıl çarpıştığında ortaya çıkar.
Noktalı ve noktasız I problemi escape kodunu nasıl bozar
Türkçede küçük "i" harfinin büyük hâli noktalı "İ", küçük "ı" harfinin büyük hâli ise noktasız "I"dır — İngilizcedeki tek "I/i" çiftinden farklı olarak dört ayrı karakter söz konusudur. Bir escape fonksiyonu metni "Türkçe kültürü" varsayarak değil "İngilizce (invariant)" kültürüyle küçük/büyük harfe çevirirse, "İstanbul" kelimesindeki İ harfi beklenmedik biçimde "i̇" gibi garip bir forma dönüşebilir — bu, saf HTML escape'ten çok, üst katmandaki string işleme kodunda karşılaşılan klasik bir Türkçe hatasıdır.
Türkçeye özgü harfler: ç, ğ, ı, ö, ş, ü
"çağırış" gibi bir kelime, ASCII'de karşılığı olmayan altı farklı harf içerebilir. UTF-8 ile bunların hiçbiri artık entity gerektirmez, ama eski ISO-8859-9 (Latin-5) tabanlı sistemlerden aktarılan içerikte veya eski e-posta şablonlarında bu harflerin ç, ĝ gibi (ğ için resmî bir named entity bile yoktur, sayısal ğ kullanılır) sayısal karşılıklarına hâlâ rastlanabilir.
Escape edilmesi gereken minimum karakter kümesi
<→<— bir etiket başlamasın diye.>→>— bir etiketten sonra metni doğru şekilde kapatmak için.&→&— & işaretinin başka bir entity'nin başlangıcı olarak okunmaması için."ve'→",'— tırnak içindeki özniteliklerin içinde zorunludur.
XSS ile bağlantısı
XSS açıklarının çoğu tam olarak kullanıcı tarafından girilen metnin HTML'e escape edilmeden eklenmesi yüzünden ortaya çıkar. "<script>...</script>" entity'ye dönüştürülmeden çıktı verilirse, tarayıcı bunu kod olarak çalıştırır. Escape etmek, dinamik içerik gösterirken temel — ama tek olmayan — bir korumadır.
Bağlam önemlidir: metin mi, öznitelik mi
<, > ve & karakterlerini escape etmek etiketler arasındaki metin için yeterlidir, ancak tırnak içindeki bir özniteliğin içinde ayrıca kullanılan tırnak karakterinin — çift ya da tek — de escape edilmesi gerekir. Öznitelik çift tırnakla sınırlandırılmışsa ve değerin içinde escape edilmemiş bir çift tırnak varsa, işaretleme beklenenden erken kırılır.