
Workflow sandbox GitHub Actions pour la reproduction de CVE-2025-46820
Construit sur la base du DOMDocument natif de PHP, ce projet donne accès aux API DOM modernes, comme vous vous y attendriez en travaillant avec du code côté client dans le navigateur.
Effectuer des manipulations DOM dans votre code côté serveur améliore la façon dont les pages dynamiques peuvent être construites. L'utilisation d'une interface orientée objet standardisée signifie que la page peut être pré-traitée, au bénéfice des navigateurs, des serveurs web et des réseaux de diffusion de contenu.
Remarque importante : l'exemple présenté ici est à titre d'illustration, mais utiliser le DOM pour définir directement des données dans les valeurs des éléments couple étroitement la logique à la vue, ce qui est considéré comme une mauvaise pratique. Veuillez consulter la bibliothèque DomTemplate pour une solution plus robuste de liaison de données au DOM.
Considérez une page avec un formulaire, comportant un élément de saisie pour entrer votre nom. Lorsque le formulaire est soumis, la page doit vous saluer par votre nom.
Voici un exemple simple de la façon dont les fichiers HTML sources peuvent être traités comme des modèles. Cela peut facilement être appliqué à des pages modèles plus avancées pour fournir un contenu dynamique, sans nécessiter de techniques non standard telles que {{accolades}} pour les espaces réservés, ou la construction HTML sujette aux erreurs echo '<div class='easy-mistake'>' . $content['opa'] . '</div>' depuis PHP.
name.html)<!doctype html>
<h1>
Bonjour, <span class="name-output">vous</span> !
</h1>
<form>
<input name="name" placeholder="Votre nom, s'il vous plaît" required />
<button>Envoyer</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ésente toutes les spécifications HTMLElement, telles que HTMLAnchorElement (<a>), HTMLButtonElement (<button>), HTMLInputElement (<input>), HTMLTableSectionElement (<thead>, <tbody>, <tfoot>), etc. Le type particulier peut être détecté avec Element::getElementType(), qui renvoie l'une des valeurs de l'énumération ElementType.DOMException pour capturer différents types d'exceptions, telles que EnumeratedValueException, HierarchyRequestError, IndexSizeException, etc.FileList, StyleSheet, VideoTrackList, WindowProxy, etc.Element::querySelector() et (Element::querySelectorAll())ClassListElement::previousElementSibling, Element::nextElementSibling, Element::children et Element::lastElementChild et firstElementChild, etc.HTMLDocument :
Ce dépôt vise à être aussi précis que possible par rapport à la spécification DOM disponible sur https://dom.spec.whatwg.org/ - à partir de la v4.0.0, toutes les fonctionnalités sont implémentées avec les écarts mineurs mais inévitables suivants par rapport à la norme :
tagName des éléments est en majuscules.HTMLElement, Element::getElementType() doit être appelé - aucune sous-classe de Element n'est disponible pour une utilisation avec instanceof, par exemple.HTMLInputElement::files renvoie un FileList qui énumère tous les fichiers sélectionnés par l'utilisateur via l'interface du navigateur. Ce type de fonctionnalité est impossible à implémenter côté serveur, mais a été simulé pour rester cohérent avec la spécification. Toute tentative d'utilisation de fonctionnalités côté client dans cette bibliothèque lève une ClientSideOnlyFunctionalityException.Ce dépôt vise à être aussi précis que possible par rapport à la spécification DOM. Une extension du dépôt est disponible sur https://php.gt/domtemplate qui ajoute la création de modèles de pages et la liaison de données via des éléments personnalisés et des attributs de modèles, introduisant des fonctionnalités côté serveur similaires à celles des WebComponents.
Depuis la sortie de PHP 8.4, une nouvelle classe native HTMLDocument est fournie nativement dans PHP. Grâce à ses liaisons natives, toutes les opérations sont beaucoup plus rapides. Des travaux ont été entrepris pour que l'implémentation Dom de PHPGT utilise le nouveau code natif. Heureusement, le DOM est une norme très bien définie, donc quoi qu'il arrive, des modifications minimes ou nulles seront nécessaires à votre code.
Jetez un œil aux benchmarks sur la branche php84-benchmark : la plupart des opérations enregistrent une augmentation de vitesse de 90 % ou plus en passant à l'implémentation native !
Plus d'informations seront détaillées dans le readme lorsque davantage de travaux auront été réalisés vers une implémentation des classes natives.