HTML Entity Kodlayıcı / Çözücü

Özel karakterleri HTML varlıklarına (&, <, ©) çevirin veya varlıkları okunur metne çözün — iki yön, canlı.

956 görüntülenme

Nasıl Çalışır

HTML, kendi söz dizimi için birkaç karakteri ayırmıştır: < ve > etiketleri işaretler, & bir varlık (entity) referansını başlatır. Bu karakterler sayfaya eklenen içerik içinde — bir yorum, kullanıcı adı, ekrana geri yansıtılan bir arama sorgusu — harfi harfine geçerse, tarayıcı onları metin olarak göstermek yerine işaretleme olarak ayrıştırmaya çalışır. Kodlama, bu karakterleri varlık biçimine (&lt;, &gt;, &amp;) çevirerek yorumlanmak yerine olduğu gibi görünmesini sağlar. Çözme ise tersini yapar; &amp; veya &#8217; gibi varlıkları temsil ettikleri gerçek karaktere döndürür.

Bu kozmetik bir detay değil, bir güvenlik kontrolüdür. Bir yorum kutusu kullanıcı girdisini önce kodlamadan sayfa HTML'ine eklerse, bir ziyaretçi <script>...</script> yazıp o kodun sayfayı gören her ziyaretçinin tarayıcısında gerçekten çalışmasını sağlayabilir — bu açık türüne XSS (Cross-Site Scripting) denir; güvenilmeyen çıktıyı HTML'e dokunmadan önce kodlamak bunun standart savunmasıdır. Örneğin 5 < 10 & 10 > 5 metni kodlanınca 5 &lt; 10 &amp; 10 &gt; 5 olur; bu, doğru görünür ve işaretlemeyle karıştırılamaz.

Bilinmesi Gerekenler

  • İsimli ve sayısal varlıklar aynı karakteri farklı biçimde temsil eder. &apos; (isimli) ile &#39; (sayısal) ikisi de tek tırnak anlamına gelir, ama isimli varlıklar ayrıştırıcının o ismi tanımasına bağlıdır — sayısal varlıklar (ondalık veya &#x onaltılık) evrensel desteklenir ve makine üretimi çıktı için daha güvenlidir.
  • Kodlama tek savunma değildir. Metin içeriğini korur; öznitelikler, URL'ler ve satır içi JavaScript bağlamları kendi kaçış kurallarını gerektirir, çünkü href="javascript:..." içindeki bir değer veya bir <script> bloğu, düz gövde metninden farklı kurallarla ayrıştırılır.
  • Dönüşüm yereldir. Bu araç tarayıcınızın kendi DOM ayrıştırıcısını kullanır — hiçbir şey yüklenmez veya kaydedilmez.
  • Her sunucu-taraflı şablon dili varsayılan olarak otomatik kaçış (auto-escape) yapmaz. Bazıları (eski PHP çıktısı veya ham string birleştirme gibi) kaçış fonksiyonunu açıkça çağırmanızı gerektirir — bunu unutmak, gerçek dünyadaki XSS hatalarının en yaygın kaynaklarından biridir.
  • Bazı entity'ler görsel olarak neredeyse ayırt edilemez. Örneğin düz tek tırnak (') ile tipografik tek tırnak (&#8217;) ekranda çok benzer görünür ama farklı bayt dizileridir; kod veya URL içeren metinlerde bu fark önemli olabilir.

Somut bir örnek: Güzel yazı! 5 < 10, değil mi? içeren bir yorum alanı düz metin olarak özel bir işlem gerektirmez, ama bu metin HTML şablonuna kaçışsız eklenir eklenmez, kötü niyetli bir ziyaretçi bunun yerine <img src=x onerror=alert(1)> gönderebilir — kodlama bunu çalışan bir görsel-hata işleyicisi yerine zararsız, görünür bir metne dönüştürür. Bu araç aynı zamanda tersten de işe yarar: entity dolu bir sayfa kaynağını (view-source) okurken, eski bir CMS'ten dışa aktarılan içeriği temizlerken veya entity-kodlu "ve" işareti gerektiren bir e-posta şablonu için metin hazırlarken.

Sıkça Sorulan Sorular

Metni HTML'e koymadan önce neden kodlamalı?

HTML içeriğinde kaçışsız < veya & işaretleme olarak yorumlanabilir; bu sayfa düzenini bozabilir ya da çok daha kötüsü, enjekte edilen <script> veya <img onerror> etiketinin gerçekten çalışmasına (Cross-Site Scripting) izin verebilir. &lt; ve &amp;'ye kodlamak, kullanıcı ne yazmış olursa olsun metni düz ve zararsız tutar.

Hem isimli hem sayısal varlıkları çözer mi?

Evet — çözme hem isimli varlıkları (&amp;copy;) hem sayısal olanları anlar; ister ondalık (&amp;#169;) ister onaltılık (&amp;#x00A9;) olsun. Üçü de aynı © karakterini temsil eder; araç bunların hepsini tek seferde gerçek karaktere normalize eder, karışık bir metinde her ikisi bir arada bulunsa bile.

Sayısal varlık mı isimli varlık mı kullanmalıyım?

İsimli varlıklar (&amp;apos;, &amp;hellip;) kaynak kodda daha okunur ama ayrıştırıcının o tam ismi tanımasına bağlıdır — daha az bilinen bazılarının eski araçlarda desteği tutarsızdır. Sayısal varlıklar (&amp;#39;, &amp;#8230;) yaşı veya üreticisi ne olursa olsun her HTML ayrıştırıcısı tarafından evrensel olarak anlaşılır; otomatik araçların ve sanitizasyon kütüphanelerinin bunları tercih etmesinin sebebi budur. Elle yazılan içerikte isimli, otomatik üretilen çıktıda sayısal varlık genelde daha güvenli bir seçimdir.

Sadece kodlamak sayfamı XSS'e karşı tamamen güvenli yapar mı?

Metin düğümlerini korur, ama HTML'de başka enjeksiyon bağlamları da vardır — bir öznitelik değerinin içi, bir URL'in içi, bir <script> veya <style> bloğunun içi — çünkü tarayıcının ayrıştırıcısı belgede nerede olduğuna göre kuralları değiştirir. Metin içeriğini entity ile kodlamak temel bir katmandır, tüm savunma değildir; bazı sınırlı HTML'e bilerek izin vermek istediğinizde kullanılan, tüm etiketleri temizleyen veya yeniden yazan daha kapsamlı bir "sanitizasyon" adımı ise ayrı bir araçtır.

Metnim bir yere gönderiliyor mu?

Hayır — dönüşüm, DOM'un kendi ayrıştırıcısıyla tarayıcınızda anında olur; hiçbir şey yüklenmez, kaydedilmez veya loglanmaz. Bu da onu, enjeksiyon denemesi barındırdığından şüphelendiğiniz gerçek kullanıcı içeriğini test etmek için bile güvenli kılar.

Yorumlar

Henüz yorum yok — ilk yorumu siz yazın!

Benzer Araçlar