
Авторизованная исследовательская лаборатория безопасности, воспроизводящая CVE-2025-46820 (GHSA-cwj7-6v67-2cm4): GITHUB_TOKEN сохраняется в публично загружаемых CI-артефактах в phpgt/Dom. Снимок phpgt/Dom @ b73d7e8.
Автоматизированный исследовательский артефакт — не вышестоящий проект.
Этот репозиторий — одноразовая лаборатория, созданная автоматизированной средой для магистерской диссертации в Université Laval по воспроизведению опубликованных уязвимостей рабочих процессов GitHub Actions. Это точный снимок
phpgt/Domна коммитеb73d7e8b54963796132df99902c3224016511bb9(2025-03-21), распространённый под собственной лицензией этого проекта, файл которой включён без изменений в этот снимок.Вышестоящий проект не участвует, никогда не является целью, а изучаемая здесь уязвимость уже публична. Каждый секрет и переменная в этом репозитории — случайно сгенерированное фиктивное значение — никаких реальных учётных данных здесь нет. Ссылки на действия и образы раннеров закреплены на те значения, которым они соответствовали на 2025-03-21; см.
pinning.mdв выводе среды для каждого изменения, внесённого в снимок.Вопросы или возражения: [email protected]
Построенный на основе нативного DOMDocument в PHP, этот проект предоставляет доступ к современным DOM API, как вы ожидали бы при работе с клиентским кодом в браузере.
Выполнение манипуляций с 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 в PHP нативно появился новый класс HTMLDocument. Благодаря нативным привязкам все операции выполняются гораздо быстрее. Начата работа по адаптации реализации Dom от PHPGT для использования нового нативного кода. К счастью, DOM — это очень хорошо определённый стандарт, поэтому что бы ни произошло, для вашего кода потребуется минимум изменений или они не потребуются вовсе.
Взгляните сами на бенчмарки в ветке php84-benchmark: большинство операций, согласно записям, показывают увеличение скорости на 90% и более при переходе на нативную реализацию!
Дополнительная информация будет изложена в readme, когда будет проделана дальнейшая работа по реализации нативных классов.