HTML spesifikasyonu değişikliği: Özelliklerde < ve > karakterlerinin kaçırılması

Michał Bentkowski
Michał Bentkowski

Yayınlanma tarihi: 12 Haziran 2025

20 Mayıs 2025'te, HTML spesifikasyonu, özelliklerde < ve > karakterlerinden kaçacak şekilde güncellendi. Bu güncelleme, mutasyon XSS (mXSS) güvenlik açıklarının önlenmesine yardımcı oldu. Bu değişiklik, 28 Mayıs 2025'te Beta sürümüne yükseltilen ve 24 Haziran 2025'te kararlı sürüm olacak Chrome 138'de kullanıma sunuldu.

Bu yayında, HTML özelliğinin kaçma değişikliğinin web geliştiricileri üzerindeki etkisi ve olası kesintiler ayrıntılı olarak açıklanmaktadır. Bu değişikliğin güvenlikle ilgili gerekçesi, Güvenlik Mühendisliği blogundaki ilgili yayınımızda açıklanmıştır.

Değişiklikler

data-content özelliği "<u>hello</u>" değerine sahip bir <div> öğeniz olduğunu varsayalım. div.outerHTML dosyasını okuduğunuzda ne olur?

Geçmişte aşağıdaki HTML'yi alırdınız:

<div data-content="<u>hello</u>"></div>

Değişiklikten sonra aşağıdaki HTML'yi alırsınız:

<div data-content="&lt;u&gt;hello&lt;/u&gt;"></div>

Daha önce, özelliklerde < veya > karakterleri için kaçış karakteri kullanılmıyordu. Bu karakterlerin ikisi de her zaman kaçılır.

Ne değişmedi?

Değişiklik, yalnızca serileştirme sırasında HTML parçalarının dize temsiline nasıl dönüştürüldüğünü değiştirir. Etki, innerHTML veya outerHTML özelliklerine erişilen veya bir öğede getHTML() yönteminin çağrıldığı senaryolarla sınırlıdır. Bu işlemler, mevcut DOM yapısını alır ve metin biçiminde bir HTML temsili oluşturur.

Bu değişiklik, HTML ayrıştırmayı etkilemez. Aşağıdaki HTML'yi ele alalım:

<div id="div1" data-content="<u>hello</u>"></div>
<div id="div2" data-content="&lt;u&gt;hello&lt;/u&gt;"></div>

Her iki div da tam olarak aynı şekilde ayrıştırılır ve her iki durumda da div.dataset.content, "<u>hello</u>" değerini döndürür.

Hangi veriler silinmez?

Özellik değerlerini almak için getAttribute, getAttributeNS, dataset veya attributes gibi bir DOM API'si kullanıyorsanız bu API'ler, özellikle < ve > kodunun çözüldüğü durumlarda, öncekiyle aynı kod çözülmüş değerleri döndürür.

Tüm console.log satırlarının "<u>"'i günlüğe kaydedeceği aşağıdaki örneği inceleyin:

<div data-content="&lt;u&gt;"></div>
const div = document.querySelector("div");
// All of the following will log "<u>"
console.log(div.getAttribute("data-content"));
console.log(div.dataset.content);
console.log(div.attributes['data-content'].value);

Ne gibi sorunlar yaşanabilir?

Özellikleri almak için innerHTML ve outerHTML

Bir özelliğin değerini ayıklamak için innerHTML veya outerHTML kullanırsanız kodunuz bozulabilir. Biraz karmaşık olsa da aşağıdaki örneği inceleyin:

<div data-content="<u>"></div>
const div = document.querySelector("div");
const content = div.outerHTML.match(/"([^"]+)"/)[1];
console.log(content);

Bu kod, bu değişiklikten sonra farklı bir davranış sergileyecektir. Daha önce content, "<u>" değerine eşitti ancak şimdi "&lt;u&gt;" değerine eşit.

HTML'yi normal ifadelerle ayrıştırmanın önerilmez. Bir özelliğin değerini almanız gerekiyorsa önceki bölümlerde açıklanan DOM API'lerini kullanın.

Uçtan uca testler

HTML oluşturmak için Chromium'u kullandığınız bir CI/CD ardışık düzeniniz varsa ve HTML'yi statik bir beklenen değerle karşılaştırmak için testler yazdıysanız herhangi bir özellik < veya > içeriyorsa bu testler bozulabilir.

Bu, beklenen bir kesintidir. Beklenen değeri, tüm < ve > karakterlerinin sırasıyla &lt; ve &gt;, olarak kodlanacağı şekilde güncellemeniz gerekir.

Özet

Bu blog yayınında, HTML spesifikasyonunda yapılan bir değişiklik açıklanıyordu. Bu değişiklik, tarayıcılardaki bazı mutasyon XSS örneklerini önleyerek güvenliği artırmak için tarayıcılardaki özelliklerde < ve > karakterlerinden kaçınma işleminin başlatılmasına neden olacak.

Bu değişiklik, 24 Haziran 2025'te Chromium (138 sürümü) ve Firefox (140 sürümü) kullanıcılarının tamamı için geçerli olacaktır. Bu özellik, Eylül 2025'te yayınlanması planlanan Safari 26 Beta sürümüne de dahildir.

Bu değişikliğin web sitenizi bozduğunu düşünüyorsanız ve bu sorunu kolay bir şekilde çözemiyorsanız lütfen https://issues.chromium.org/ adresinden hata kaydı gönderin.

Ek bilgiler