تاريخ النشر: 12 حزيران (يونيو) 2025
في 20 أيار (مايو) 2025، تم تعديل مواصفات HTML لتشفير <
و>
فيسمات
، ما ساعد في منع ثغرات هجمات XSS المعدَّلة (mXSS)
. تم تطبيق هذا التغيير في الإصدار 138 من Chrome، الذي تم ترقيته إلى الإصدار التجريبي في 28 أيار (مايو) 2025، وسيصبح الإصدار الثابت في 24 حزيران (يونيو) 2025.
توضّح هذه المشاركة بالتفصيل تأثير تغيير ترميز سمة HTML على مطوّري الويب والمشاكل المحتملة التي قد تنتج عنه. ويمكنك الاطّلاع على المشاركة ذات الصلة في مدوّنة "هندسة الأمان" لمعرفة السبب المنطقي للأمان وراء هذا التغيير.
أوجه التغيير
لنفترض أنّ لديك عنصرًا <div>
تتضمّن سمته data-content
قيمة "<u>hello</u>"
. ماذا يحدث عند قراءة div.outerHTML
؟
في السابق، كان يتم عرض رمز HTML التالي:
<div data-content="<u>hello</u>"></div>
بعد إجراء التغيير، ستحصل على رمز HTML التالي:
<div data-content="<u>hello</u>"></div>
في السابق، لم يتم ترميز <
أو >
في السمات. والآن، يتم دائمًا ترميز كلا هذين الحرفين.
ما لم يتم تغييره
يُعدّ هذا التغيير حصريًا لتعديل كيفية تحويل أجزاء HTML إلى تمثيل
سلسلة أثناء التسلسل. يقتصر التأثير على السيناريوهات
التي يتم فيها الوصول إلى السمتَين innerHTML
أو outerHTML
، أو عند استدعاء الأسلوب
getHTML()
على عنصر. تأخذ هذه العمليات بنية DOM الحالية وتُنشئ تمثيلًا نصيًا لـ HTML.
لا يؤثّر هذا التغيير في تحليل HTML. راجِع رمز HTML التالي:
<div id="div1" data-content="<u>hello</u>"></div>
<div id="div2" data-content="<u>hello</u>"></div>
سيتم تحليل كلا العنصرَين div
بالطريقة نفسها تمامًا، وفي كلتا الحالتَين، ستعرض دالة
div.dataset.content
القيمة "<u>hello</u>"
.
ما هي العناصر التي لن تتأثر؟
إذا كنت تستخدم أيًا من واجهات برمجة تطبيقات DOM، مثل
getAttribute
،
getAttributeNS
،
dataset
،
أو
attributes
،
لاسترداد قيم السمات، ستُعرِض القيم نفسها التي تم فك ترميزها
في السابق، وبشكل خاص مع فك ترميز <
و>
.
راجِع المثال التالي الذي سيتم فيه تسجيل كل سطور console.log
"<u>"
:
<div data-content="<u>"></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);
ما هي المشاكل التي يمكن أن تحدث؟
innerHTML وouterHTML للحصول على السمات
إذا كنت تستخدم innerHTML
أو outerHTML
لاستخراج قيمة سمة، يمكن أن تتعطل
القيمة في الرمز. راجِع المثال التالي، مع العِلم أنّه معقّد قليلاً:
<div data-content="<u>"></div>
const div = document.querySelector("div");
const content = div.outerHTML.match(/"([^"]+)"/)[1];
console.log(content);
سيظهر سلوك مختلف لهذه التعليمات البرمجية بعد هذا التغيير. في السابق، كان
content
يساوي "<u>"
، ولكنّه الآن يساوي "<u>"
.
يُرجى العِلم أنّه لا يُنصح بتحليل صفحات HTML باستخدام التعبيرات العادية. إذا كنت بحاجة إلى الحصول على قيمة لسمة، استخدِم واجهات برمجة تطبيقات DOM الموضّحة في الأقسام السابقة.
الاختبارات الشاملة
إذا كانت لديك مسار عمل متكامل/متسلسل للتطوير (CI/CD) تستخدم فيه Chromium لإنشاء صفحات HTML،
وكنت قد كتبت اختبارات لمقارنة صفحات HTML بقيمة ثابتة متوقّعة،
يمكن أن تتعطل هذه الاختبارات إذا كانت أي سمة تحتوي على <
أو >
.
هذا خطأ متوقّع، وعليك تعديل القيمة المتوقّعة لكي يتم ترميز كل أحرف
<
و>
إلى <
و>,
على التوالي.
ملخّص
توضّح هذه المشاركة في مدوّنة التغييرات التي تم إجراؤها على مواصفات HTML والتي ستؤدي إلى بدء المتصفّحات في ترميز <
و>
في السمات لتحسين الأمان من خلال منع بعض حالات هجمات XSS المعدَّلة.
سيتوفّر هذا التغيير لجميع المستخدمين في 24 حزيران (يونيو) 2025 على Chromium (الإصدار 138) وFirefox (الإصدار 140). وهي مضمّنة أيضًا في الإصدار التجريبي من Safari 26 الذي من المفترض أن يتم طرحه في أيلول (سبتمبر) 2025 تقريبًا.
إذا كنت تعتقد أنّ هذا التغيير قد أدّى إلى تعطُّل موقعك الإلكتروني وليس لديك طريقة سهلة لحلّ المشكلة، يُرجى إرسال بلاغ عن خطأ على الرابط https://issues.chromium.org/.