HTML varlık kodlayıcı / çözücü

Metni HTML içinde güvenli olacak şekilde kaçışlayın ya da adlı ve sayısal varlıkları temsil ettikleri karakterlere geri çözün.

Metin
Kodlanmış

Çıktı burada görünecek

Bu araç ne yapar

HTML'in, metin olarak kastettiğiniz bir küçüktür işaretiyle bir etiket açan işareti ayırt etmenin bir yolu yoktur. Dil bunu varlıklarla çözer: bir karakteri, biçimlendirme olarak okunmadan temsil eden kısa kaçış dizileri. Bu araç her iki yönde de dönüştürür — düz metni kaçışlanmış biçimine ve kaçışlanmış HTML'i temsil ettiği karakterlere geri.

Her iki yön de tümüyle tarayıcınızda çalışır. Bu, çoğu araçtan daha önemlidir, çünkü insanların bir varlık çözücüye yapıştırdığı metin genellikle kazınmış bir sayfa, bir müşteri e-postası ya da birinin anlamlandırmaya çalıştığı bir veritabanı sütunudur.

Önemli olan beş karakter

Binlerce varlık vardır, ama metni güvenli kılmak için yalnızca bir avuç gerekir. Buradaki kodlama tam olarak beş karakteri değiştirir ve diğer her şeyi okunabilir bırakır:

  • Ve işareti & olur — bu ilk, yoksa diğer her değiştirme kendisi yeniden bir varlık olarak okunurdu.
  • Küçüktür işareti < olur — bir etiket başlatabilen karakter.
  • Büyüktür işareti > olur — tek başına daha az tehlikeli, bakışım için ve dikkatsiz ayrıştırıcılardan sağ çıkmak için kaçışlanır.
  • Çift tırnak " olur — çift tırnakla yazılan öznitelik değerlerinin içinde gereklidir.
  • Kesme işareti ' olur — tek tırnakla yazılan öznitelik değerlerinin içinde gereklidir.

Bu sonuncusu bilerek sayısal yazılır. Onun bir adı vardır, ', ama XML'den gelir ve HTML 4 onu asla tanımlamadı; bu yüzden eski ayrıştırıcılar onu değişmez metin olarak geçirir ve kaçışlama sessizce başarısız olur. Sayısal biçim her yerde her zaman çalışmıştır; ciddi kaçışlama kütüphanelerinin onu yaymasının nedeni budur.

Adlı, onluk ve on altılık

Herhangi bir karakter üç şekilde yazılabilir ve çözme hepsini kabul eder. Uzun tire (em dash) iyi bir örnektir:

named     —      the readable form, but only for characters that have a name
decimal   —      the code point in base 10
hex       —     the same code point in base 16, the notation Unicode charts use

Bu araç çözerken HTML 4 kümesinin 255 adını tanır — Latin-1 harfleri, Yunan alfabesi, oklar, matematiksel simgeler ve tipografik noktalama, ki bunlar aralarında gerçek metinde ortaya çıkan hemen hemen her şeyi kapsar. HTML 5 yaklaşık 2200 tane daha tanımlar, neredeyse tümü belirsiz matematiksel simgeler; o tabloyu taşımak, çoğu belgenin asla kullanmadığı adlar karşılığında her sayfa yüklemesine onlarca kilobayt eklerdi. Küme dışındaki bir ad düşürülmek yerine bildirilir; böylece maliyet bir uyarıdır, asla yanlış bir yanıt değil.

Kodlama diğer yöne gider ve bilerek sade kalır: yukarıdaki beş karakter için adlar, diğer her şey için onluk sayılar. Karakterin kendisi bir UTF-8 belgesinde kusursuzca geçerliyken hiçbir şey … ya da ’ hâline getirilmez.

Kaçışlama tek bir kural değil, dörttür

Varlık kaçışlamayı enjeksiyonun yanıtı olarak ele almak caziptir ve öğe içeriğinin içinde gerçekten öyledir. Ama HTML aslında birbirinin içine yerleşmiş dört dildir ve her birinin kendi kuralları vardır. Varlık kaçışlama bu yerlerin ilk ikisinde doğru, geri kalanında yararsızdır:

  • Öğe içeriği — etiketler arasındaki metin. Varlık kaçışlama tam olarak doğrudur.
  • Tırnaklı öznitelik değerleri. Öznitelik gerçekten tırnaklıysa, varlık kaçışlama doğrudur; tırnaksızsa değerdeki bir boşluk özniteliği sonlandırır ve kaçışlama size hiçbir şey kazandırmaz.
  • Bir script bloğunun içinde. Varlıklar değil, JavaScript dize kaçışlama uygulanır — tarayıcı orada varlıkları çözmez; bu yüzden kaçışlanmış bir tırnak, değişmez " karakterleri olarak gelir.
  • href ve src gibi URL öznitelikleri. Varlık kaçışlama bir javascript: URL'sini durdurmaz, çünkü tehlike bir varlığın değiştireceği herhangi bir karakterde değil, şemadadır.

Pratik kural: metni, sonradan her yerde tutacağı umuduyla bir kez, erkenden değil; metnin bir belgeye eklendiği noktada, tam olarak indiği bağlamın kurallarını kullanarak kaçışlayın.

Neden bazen & görürsünüz

Bu, bir varlık çözücüye başvurmanın en yaygın tek nedenidir. Metin kaçışlandı, sonra yeniden kaçışlandı — genellikle bir kez uygulama kodu, bir kez de çıktısını zaten kaçışlayan bir şablon motoru ya da çatı tarafından:

original     Fish & Chips
escaped      Fish & Chips        renders as: Fish & Chips
escaped x2   Fish & Chips    renders as: Fish & Chips

Çözme tam olarak bir katmanı kaldırır; böylece onu bir kez çalıştırmak hangi durumda olduğunuzu söyler. Çıktı hâlâ varlıklar içeriyorsa, birden çok katman vardı. Çözüm neredeyse hiçbir zaman görüntüleme zamanında varlıkları soymak değildir — yinelenen kaçışlama adımını bulup kaldırmaktır, çünkü aynı hata saklanan veriyi sessizce bozuyordur.

ASCII olmayan ve bunun için seçenek

UTF-8 olarak sunulan bir sayfa, aksanlı harfler, İbranice, Arapça, Çince ya da emoji için varlıklara gerek duymaz. Bu karakterler oldukları gibi geçerlidir ve onları okunabilir bırakmak kaynağı okunaklı ve dosyayı daha küçük tutar. Buradaki varsayılan budur.

Seçenek vardır, çünkü bazı hedefler hâlâ düz ASCII'de ısrar eder: eski e-posta şablonları, 127 üstündeki baytları bozan sistemler ya da kodlamasını kimsenin değiştirmeye yanaşmadığı bir veritabanı sütunu. Onu açmak, böyle her karakteri onluk bir referans olarak yazar — é, é olur, א, א olur.

Emoji bir not değer. Bir emoji, tüm kod noktası için tek bir referans olarak yazılır, örneğin 🙂, asla iki yarım olarak değil. JSON kaçışlama aracını kullandıysanız bu, orada olanın tersidir; orada biçim, özellikle bir emojinin iki \u kaçışına bölünmesini gerektirir. Aynı karakter, iki doğru yanıt, çünkü iki biçim kaçışlamayı farklı birimler üzerinden tanımlar.

Bir referans çözülemediğinde

Buradaki çözme asla başarısız olmaz ve hiçbir şeyi silmez. Çözülemeyen bir referans, bulunduğu gibi tam olarak bırakılır ve çıktının üstünde satır ve sütunuyla listelenir. Üç şey bildirilir:

  • &nbps; gibi bilinmeyen bir ad — neredeyse her zaman   için bir yazım hatası. Bu, üzerine harekete geçmeye değer uyarıdır: içeriğinizden bir boşluğun eksik olduğu ve kimsenin fark etmediği anlamına gelir.
  • � gibi ya da Unicode aralığının üstünde bir değer gibi, bir karakter olmayan bir sayı. Onu çözecek bir şey yoktur, bu yüzden metin olarak kalır.
  • 128 ile 159 arasında bir sayı. Aşağıya bakın.

Tek başına bir ve işareti hiç bildirilmez. HTML'de R&D ve Q&A sıradan metindir ve her başıboş ve işaretini bir hata olarak ele almak, önemli olan uyarıları düzyazının gürültüsü altında gömerdi.

128'den 159'a aralığı gerçek bir tuhaflıktır. Bu sayılar, kimsenin asla yazmayı kastetmediği görünmez denetim karakterlerini adlandırır; bir belge Windows-1252'de yazıldığı için görünürler, orada aynı sayılar kıvrık tırnaklar, tireler ve euro işaretidir. Tarayıcılar tam da bu nedenle onları sessizce Windows-1252 olarak okur ve bu araç, sonuç bir sayfanın gerçekte göstereceği şeye eşit olsun diye o davranışı eşler — ama bunu uyarılarda söyler, çünkü istemediğiniz sessiz bir değiştirme, gürültülü olandan daha kötüdür.

Sıkça sorulan sorular

Bu beş karakteri kaçışlamak XSS'i durdurmak için yeterli mi?
Öğe içeriğinde ve tırnaklı öznitelik değerlerinde, evet — tam olarak bunun içindir. Bir script ya da style bloğunun içinde, tırnaksız bir öznitelikte ya da href gibi bir URL özniteliğinde yeterli değildir; bunların her biri kendi kaçışlama kurallarını gerektirir. Kaçışlama, metnin değil, metnin indiği yerin bir özelliğidir.
Kesme işareti neden ' değil de ' olarak kodlanıyor?
Çünkü ', HTML 4'ün asla tanımlamadığı bir XML varlığıdır. HTML 5'ten önceki ayrıştırıcılar onu değişmez metin olarak bırakır; böylece kaçışlandığını sandığınız bir kesme işareti kaçışlanmamış olur. Sayısal biçim her ayrıştırıcıda çalışır; güvenli varsayılan olmasının nedeni budur.
Sayfam ve işareti yerine & gösteriyor. Ne oldu?
Metin iki kez kaçışlandı. Onu burada çözün: bir geçiş & ifadesini & hâline getirir, fazladan katmanı doğrular. Metni değil, hattı düzeltin — genellikle kodunuz, şablon motorunun zaten kaçışladığı çıktıyı kaçışlıyordur.
İbraniceyi, Arapçayı ya da emojiyi kodlamam gerekir mi?
UTF-8 olarak sunulan modern bir sayfa için değil; oldukları gibi geçerlidirler. ASCII olmayan seçeneğini yalnızca aşağı akıştaki bir şey düz ASCII'de ısrar ettiğinde açın, eski bir posta şablonu gibi. Her emoji o zaman tek bir sayısal referans olarak yazılır.
Araç “ ifadesini sorunsuz çözdüğü hâlde neden bunun için uyarıyor?
Çünkü 147, gördüğünüz tırnak işaretini değil, görünmez bir denetim karakterini adlandırır. Onu kullanan belgeler Windows-1252'de yazılmıştı, orada 147 kıvrık bir tırnaktır — tarayıcılar onu öyle okur ve bu araç da öyle. Uyarı, bir değiştirmenin gerçekleştiğini söyler; böylece kaynak kodlaması sizinse onu düzeltebilirsiniz.
Metnim herhangi bir yere gönderiliyor mu?
Hayır. Kodlama ve çözme tümüyle tarayıcınızda çalışır; yapıştırdığınız hiçbir şey cihazınızdan çıkmaz.