
GitHub Actions-Workflow-Sandbox zur Reproduktion von CVE-2025-46820
Dieses Projekt basiert auf dem nativen DOMDocument von PHP und bietet Zugriff auf moderne DOM-APIs, wie man es von clientseitigem Code im Browser gewohnt ist.
Die Durchführung von DOM-Manipulationen im serverseitigen Code verbessert die Art und Weise, wie dynamische Seiten erstellt werden können. Die Nutzung einer standardisierten objektorientierten Schnittstelle bedeutet, dass die Seite vorverarbeitet werden kann – zum Vorteil von Browsern, Webservern und Content-Delivery-Netzwerken.
Wichtiger Hinweis: Das hier gezeigte Beispiel dient nur zur Veranschaulichung. Die direkte Zuweisung von Daten an die Werte von Elementen über das DOM koppelt die Logik jedoch eng an die Ansicht, was als schlechte Praxis gilt. Bitte sieh dir die Bibliothek DomTemplate für eine robustere Lösung zur Datenbindung an das DOM an.
Stell dir eine Seite mit einem Formular vor, das ein Eingabefeld für deinen Namen enthält. Wenn das Formular abgeschickt wird, soll die Seite dich mit deinem Namen begrüßen.
Dies ist ein einfaches Beispiel dafür, wie HTML-Quelldateien als Vorlagen behandelt werden können. Dies lässt sich leicht auf fortgeschrittenere Vorlagenseiten anwenden, um dynamische Inhalte bereitzustellen – ohne nicht standardisierte Techniken wie {{geschweifte Klammern}} für Platzhalter oder fehleranfällige HTML-Konstruktion aus PHP heraus wie echo '<div class='easy-mistake'>' . $content['opa'] . '</div>'.
name.html)<!doctype html>
<h1>
Hallo, <span class="name-output">du</span> !
</h1>
<form>
<input name="name" placeholder="Dein Name, bitte" required />
<button>Absenden</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 Ausnahmetypen, wie EnumeratedValueException, HierarchyRequestError, IndexSizeException usw.FileList, StyleSheet, VideoTrackList, WindowProxy usw.Element::querySelector() und (Element::querySelectorAll())ClassListElement::previousElementSibling, Element::nextElementSibling, Element::children sowie Element::lastElementChild und firstElementChild usw.HTMLDocument:
Dieses Repository strebt eine möglichst genaue Übereinstimmung mit der DOM-Spezifikation unter https://dom.spec.whatwg.org/ an – ab Version 4.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.HTMLInputElement::files eine FileList zurück, die alle Dateien auflistet, die der Benutzer über die Browseroberfläche ausgewählt hat. Diese Art von Funktionalität ist serverseitig nicht implementierbar, wurde aber aus Konsistenzgründen mit der Spezifikation als Stub bereitgestellt. Der Versuch, clientseitige Funktionalität innerhalb dieser Bibliothek zu verwenden, löst eine ClientSideOnlyFunctionalityException aus.Dieses Repository soll der DOM-Spezifikation so genau wie möglich entsprechen. Eine Erweiterung des Repositories ist unter https://php.gt/domtemplate verfügbar, die Seitenvorlagen und Datenbindung über 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 direkt in PHP enthalten ist. Da diese native Bindungen besitzt, sind alle Operationen deutlich schneller. Es wurde mit der Arbeit begonnen, die DOM-Implementierung von PHPGT so anzupassen, dass sie den neuen nativen Code nutzt. Glücklicherweise ist das DOM ein sehr klar definierter Standard, sodass unabhängig davon, was passiert, nur minimale oder gar keine Änderungen an deinem Code erforderlich sein werden.
Wirf selbst einen Blick auf die Benchmarks im Branch 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.