
Autorisiertes Sicherheitsforschungslabor zur Reproduktion von CVE-2025-46820 (GHSA-cwj7-6v67-2cm4): GITHUB_TOKEN wurde in öffentlich herunterladbare CI-Artefakte in phpgt/Dom persistiert. Snapshot von phpgt/Dom @ b73d7e8.
Automatisiertes Forschungsobjekt – nicht das Upstream-Projekt.
Dieses Repository ist ein Wegwerf-Labor, das von einer automatisierten Testumgebung für eine Masterarbeit an der Université Laval zur Reproduktion veröffentlichter GitHub-Actions-Workflow-Schwachstellen erstellt wurde. Es ist eine wörtliche Momentaufnahme von
phpgt/Dombeim Commitb73d7e8b54963796132df99902c3224016511bb9(2025-03-21), weiterverbreitet unter der eigenen Lizenz dieses Projekts, deren Datei unverändert in dieser Momentaufnahme enthalten ist.Das Upstream-Projekt ist nicht beteiligt, wird niemals angegriffen, und die hier untersuchte Schwachstelle ist bereits öffentlich. Jedes Secret und jede Variable in diesem Repository ist ein zufällig generierter Dummy-Wert – es sind keine echten Anmeldedaten vorhanden. Aktionsreferenzen und Runner-Images sind auf das fixiert, was sie am 2025-03-21 aufgelöst haben; siehe
pinning.mdin der Testumgebungsausgabe für jede an der Momentaufnahme vorgenommene Änderung.Fragen oder Einwände: [email protected]
Aufbauend auf dem nativen DOMDocument von PHP bietet dieses Projekt Zugriff auf moderne DOM-APIs, wie man es bei der Arbeit mit clientseitigem Code im Browser erwarten würde.
Die Durchführung von DOM-Manipulationen in Ihrem serverseitigen Code verbessert die Art und Weise, wie dynamische Seiten erstellt werden können. Die Verwendung einer standardisierten objektorientierten Schnittstelle bedeutet, dass die Seite vorverarbeitet werden kann, was Browsern, Webservern und Content-Delivery-Netzwerken zugutekommt.
Wichtiger Hinweis: Das hier gezeigte Beispiel dient nur zur Veranschaulichung, aber die Verwendung des DOM zur direkten Zuweisung von Daten an die Werte von Elementen koppelt die Logik eng an die Ansicht, was als schlechte Praxis gilt. Bitte sehen Sie sich die Bibliothek DomTemplate für eine robustere Lösung zum Binden von Daten an das DOM an.
Stellen Sie sich eine Seite mit einem Formular vor, das ein Eingabeelement zur Eingabe Ihres Namens enthält. Wenn das Formular abgeschickt wird, soll die Seite Sie mit Ihrem Namen begrüßen.
Dies ist ein einfaches Beispiel dafür, wie Quell-HTML-Dateien als Vorlagen behandelt werden können. Dies lässt sich leicht auf fortgeschrittenere Vorlagenseiten anwenden, um dynamische Inhalte bereitzustellen, ohne nicht standardmäßige Techniken wie {{geschweifte Klammern}} für Platzhalter oder fehleranfällige HTML-Konstruktion aus PHP heraus mit echo '<div class='easy-mistake'>' . $content['opa'] . '</div>' zu benötigen.
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 repräsentiert alle HTMLElement-Spezifikationen, wie HTMLAnchorElement (<a>), HTMLButtonElement (<button>), HTMLInputElement (<input>), HTMLTableSectionElement (<thead>, <tbody>, <tfoot>) usw. Der jeweilige Typ kann mit Element::getElementType() erkannt werden, das einen der ElementType-Enum-Werte zurückgibt.DOMException-Erweiterungen zum Abfangen verschiedener Arten von Ausnahmen, wie EnumeratedValueException, HierarchyRequestError, IndexSizeException usw.FileList, StyleSheet, VideoTrackList, WindowProxy usw.Element::querySelector() und (Element::querySelectorAll())ClassListElement::previousElementSibling, Element::nextElementSibling, Element::children und Element::lastElementChild und firstElementChild usw.HTMLDocument:
Dieses Repository zielt darauf ab, so genau wie möglich der DOM-Spezifikation unter https://dom.spec.whatwg.org/ zu entsprechen – ab v4.0.0 ist die gesamte Funktionalität mit den folgenden geringfügigen, aber unvermeidbaren Abweichungen vom Standard implementiert:
tagName-Eigenschaft von Elementen ist in Großbuchstaben.HTMLElement-Typ zu prüfen, muss Element::getElementType() aufgerufen werden – es sind keine Unterklassen von Element für die Verwendung mit instanceof verfügbar, zum Beispiel.HTMLInputElement::files eine FileList zurück, die alle Dateien auflistet, die vom Benutzer über die Browseroberfläche ausgewählt wurden. Diese Art von Funktionalität ist serverseitig unmöglich zu implementieren, wurde aber aus Gründen der Konsistenz mit der Spezifikation als Stub bereitgestellt. Der Versuch, clientseitige Funktionalität innerhalb dieser Bibliothek zu verwenden, löst eine ClientSideOnlyFunctionalityException aus.Dieses Repository soll so genau wie möglich der DOM-Spezifikation entsprechen. Eine Erweiterung des Repositorys ist unter https://php.gt/domtemplate verfügbar, die Seitenvorlagen und Datenbindung durch benutzerdefinierte Elemente und Vorlagenattribute hinzufügt und serverseitige Funktionalität ähnlich der von WebComponents einführt.
Seit der Veröffentlichung von PHP 8.4 gibt es eine neue native HTMLDocument-Klasse, die nativ in PHP enthalten ist. Da diese native Bindungen hat, sind alle Operationen viel schneller. Es wurde mit der Arbeit begonnen, die Dom-Implementierung von PHPGT zur Nutzung des neuen nativen Codes zu bringen. Glücklicherweise ist das DOM ein sehr gut definierter Standard, sodass unabhängig davon, was passiert, nur minimale oder keine Änderungen an Ihrem Code erforderlich sein werden.
Werfen Sie selbst einen Blick auf die Benchmarks im Zweig php84-benchmark: Die meisten Operationen verzeichnen eine Geschwindigkeitssteigerung von 90 % oder mehr durch die Umstellung auf die native Implementierung!
Weitere Informationen werden in der Readme bereitgestellt, sobald mehr Arbeit in Richtung einer Implementierung der nativen Klassen geleistet wurde.