
مختبر أبحاث أمنية مُصرَّح به يعيد إنتاج CVE-2025-46820 (GHSA-cwj7-6v67-2cm4): GITHUB_TOKEN تم حفظه في القطع الأثرية القابلة للتنزيل علنًا في CI في phpgt/Dom. لقطة من phpgt/Dom @ b73d7e8.
أداة بحث مؤتمتة — ليست المشروع الأصلي.
هذا المستودع عبارة عن مختبر قابل للتصرف بُني بواسطة بيئة عمل مؤتمتة لأطروحة ماجستير في جامعة لافال حول إعادة إنتاج ثغرات سير عمل GitHub Actions المنشورة. وهو لقطة حرفية من
phpgt/Domعند الالتزامb73d7e8b54963796132df99902c3224016511bb9(2025-03-21)، مُعاد توزيعه بموجب ترخيص ذلك المشروع نفسه، الذي تم تضمين ملفه دون تغيير في هذه اللقطة.المشروع الأصلي ليس طرفًا معنيًا، ولا يُستهدف أبدًا، والثغرة المدروسة هنا عامة بالفعل. كل سر ومتغير في هذا المستودع هو قيمة وهمية مولّدة عشوائيًا — لا توجد أي بيانات اعتماد حقيقية. مراجع الإجراءات وصور المشغّل مثبتة على ما حُلّت إليه في 2025-03-21؛ انظر
pinning.mdفي مخرجات البيئة المؤتمتة لكل تغيير أُجري على اللقطة.الأسئلة أو الاعتراضات: [email protected]
مبني على DOMDocument الأصلي في PHP، يوفر هذا المشروع الوصول إلى واجهات DOM الحديثة، كما تتوقع عند العمل مع كود جانب العميل في المتصفح.
إجراء معالجة DOM في كود جانب الخادم يعزز الطريقة التي يمكن بها بناء الصفحات الديناميكية. استخدام واجهة موحدة موجهة للكائنات يعني أن الصفحة يمكن معالجتها مسبقًا، مما يفيد المتصفحات وخوادم الويب وشبكات توصيل المحتوى.
ملاحظة مهمة: المثال المعروض هنا لأغراض توضيحية فقط، لكن استخدام DOM لتعيين البيانات مباشرة إلى قيم العناصر يربط المنطق بالعرض بشكل وثيق، وهو ما يُعتبر ممارسة سيئة. يرجى الاطلاع على مكتبة DomTemplate للحصول على حل أكثر متانة لربط البيانات بـ DOM.
تخيل صفحة تحتوي على نموذج، مع عنصر إدخال لإدخال اسمك. عند إرسال النموذج، يجب أن ترحب بك الصفحة باسمك.
هذا مثال بسيط على كيفية التعامل مع ملفات HTML المصدرية كقوالب. يمكن تطبيق ذلك بسهولة على صفحات قوالب أكثر تقدمًا لتوفير محتوى ديناميكي، دون الحاجة إلى تقنيات غير قياسية مثل {{أقواس معقوفة}} للعناصر النائبة، أو بناء HTML عرضة للأخطاء مثل echo '<div class='easy-mistake'>' . $content['opa'] . '</div>' من داخل PHP.
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 بشكل أصلي. مع وجود هذه الارتباطات الأصلية، تكون جميع العمليات أسرع بكثير. بدأ العمل لجعل تنفيذ Dom الخاص بـ PHPGT يستخدم الكود الأصلي الجديد. لحسن الحظ، فإن DOM معيار محدد جيدًا جدًا، لذا مهما حدث، ستكون التغييرات المطلوبة على كودك ضئيلة أو معدومة.
ألقِ نظرة على المعايير على فرع php84-benchmark بنفسك: معظم العمليات سُجلت بزيادة سرعة تبلغ 90% أو أكثر عند التحول إلى التنفيذ الأصلي!
سيتم عرض مزيد من المعلومات في ملف readme عند إنجاز المزيد من العمل نحو تنفيذ الفئات الأصلية.
ChildNode::remove()