
# بيئة اختبار سير عمل GitHub Actions لإعادة إنتاج CVE-2025-46820
مبنية على DOMDocument الأصلي في PHP، يوفر هذا المشروع الوصول إلى واجهات DOM الحديثة، كما تتوقع عند العمل مع كود العميل في المتصفح.
إن إجراء عمليات معالجة DOM في كود الخادم يعزز الطريقة التي يمكن بها بناء الصفحات الديناميكية. استخدام واجهة موحدة موجهة للكائنات يعني أن الصفحة يمكن معالجتها مسبقًا، مما يفيد المتصفحات وخوادم الويب وشبكات توصيل المحتوى.
ملاحظة مهمة: المثال المعروض هنا لأغراض توضيحية فقط، لكن استخدام DOM لتعيين البيانات مباشرة إلى قيم العناصر يربط المنطق بالعرض بشكل وثيق، وهو ما يُعتبر ممارسة سيئة. يرجى الاطلاع على مكتبة DomTemplate للحصول على حل أكثر متانة لربط البيانات بـ DOM.
تخيل صفحة تحتوي على نموذج، مع عنصر إدخال لإدخال اسمك. عند إرسال النموذج، يجب أن ترحب بك الصفحة باسمك.
هذا مثال بسيط على كيفية التعامل مع ملفات HTML المصدر كقوالب. يمكن تطبيق ذلك بسهولة على صفحات قوالب أكثر تقدمًا لتوفير محتوى ديناميكي، دون الحاجة إلى تقنيات غير قياسية مثل {{أقواس معقوفة}} للمكانات، أو بناء HTML عرضة للأخطاء من داخل PHP مثل echo '<div class='easy-mistake'>' . $content['opa'] . '</div>'.
name.html)<!doctype html>
<h1>
Hello, <span class="name-output">you</span> !
</h1>
<form>
<input name="name" placeholder="Your name, please" required />
<button>Submit</button>
</form>
index.php)<?php
use Gt\Dom\HTMLDocument;
use Gt\Dom\HTMLElement\HTMLSpanElement;
require "vendor/autoload.php";
$html = file_get_contents("name.html");
$document = new HTMLDocument($html);
if(isset($_GET["name"])) {
$span = $document->querySelector(".name-output");
$span->innerText = $_GET["name"];
}
echo $document;
Element جميع مواصفات HTMLElement، مثل HTMLAnchorElement (<a>) وHTMLButtonElement (<button>) وHTMLInputElement (<input>) وHTMLTableSectionElement (<thead> و<tbody> و<tfoot>) وغيرها. يمكن اكتشاف النوع المحدد باستخدام Element::getElementType()، والذي يُرجع إحدى قيم تعداد ElementType.DOMException لالتقاط أنواع مختلفة من الاستثناءات، مثل EnumeratedValueException وHierarchyRequestError وIndexSizeException وغيرها.FileList وStyleSheet وVideoTrackList وWindowProxy وغيرها.Element::querySelector() و(Element::querySelectorAll())ClassListElement::previousElementSibling وElement::nextElementSibling وElement::children وElement::lastElementChild وfirstElementChild وغيرها.HTMLDocument:
يهدف هذا المستودع إلى أن يكون دقيقًا قدر الإمكان مع مواصفات DOM على https://dom.spec.whatwg.org/ - اعتبارًا من الإصدار v4.0.0، تم تنفيذ جميع الوظائف مع الانحرافات البسيطة التالية عن المعيار والتي لا يمكن تجنبها:
tagName للعناصر تكون بأحرف كبيرة.HTMLElement، يجب استدعاء Element::getElementType() - لا تتوفر فئات فرعية من Element للاستخدام مع instanceof، على سبيل المثال.HTMLInputElement::files كائن FileList يعدّد جميع الملفات التي يحددها المستخدم من خلال واجهة المتصفح. هذا النوع من الوظائف يستحيل تنفيذه على جانب الخادم، لكن تم إنشاؤه بشكل مبدئي للاتساق مع المواصفات. محاولة استخدام وظائف جانب العميل داخل هذه المكتبة تُلقي استثناء ClientSideOnlyFunctionalityException.يهدف هذا المستودع إلى أن يكون دقيقًا قدر الإمكان مع مواصفات DOM. يتوفر امتداد للمستودع على https://php.gt/domtemplate يضيف قوالب الصفحات وربط البيانات من خلال عناصر مخصصة وسمات قوالب، مما يقدم وظائف جانب الخادم مثل تلك الموجودة في WebComponents.
منذ إصدار PHP 8.4، تم تضمين فئة HTMLDocument أصلية جديدة في PHP. مع وجود روابط أصلية، تكون جميع العمليات أسرع بكثير. بدأ العمل لجعل تنفيذ PHPGT لـ Dom يستخدم الكود الأصلي الجديد. لحسن الحظ، فإن DOM معيار محدد جيدًا جدًا، لذا مهما حدث، ستكون التغييرات المطلوبة على كودك ضئيلة أو معدومة.
ألقِ نظرة على المعايير على فرع php84-benchmark بنفسك: معظم العمليات مسجلة بزيادة سرعة تبلغ 90% أو أكثر عند التحول إلى التنفيذ الأصلي!
سيتم عرض مزيد من المعلومات في ملف readme عند إنجاز المزيد من العمل نحو تنفيذ الفئات الأصلية.
ChildNode::remove()