
# Laboratoire de recherche en sécurité autorisé reproduisant CVE-2025-46820 (GHSA-cwj7-6v67-2cm4) : GITHUB_TOKEN persisté dans des artefacts CI téléchargeables publiquement dans phpgt/Dom. Instantané de phpgt/Dom @ b73d7e8.
Artéfact de recherche automatisé — pas le projet en amont.
Ce dépôt est un laboratoire jetable construit par un harnais automatisé pour un mémoire de maîtrise à l'Université Laval sur la reproduction de vulnérabilités publiées dans les workflows GitHub Actions. Il s'agit d'un instantané verbatim de
phpgt/Domau commitb73d7e8b54963796132df99902c3224016511bb9(2025-03-21), redistribué sous la licence propre de ce projet, dont le fichier est inclus inchangé dans cet instantané.Le projet en amont n'est pas impliqué, n'est jamais ciblé, et la vulnérabilité étudiée ici est déjà publique. Chaque secret et variable dans ce dépôt est une valeur factice générée aléatoirement — aucun identifiant réel n'est présent. Les références d'actions et les images d'exécuteur sont épinglées à ce qu'elles résolvaient le 2025-03-21 ; voir
pinning.mddans la sortie du harnais pour chaque modification apportée à l'instantané.Questions ou objections : [email protected]
Construit sur la base du DOMDocument natif de PHP, ce projet donne accès aux API DOM modernes, comme on s'y attendrait 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 illustratif, 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érons une page avec un formulaire, contenant un élément de saisie pour entrer votre nom. Lorsque le formulaire est soumis, la page doit vous saluer par votre nom.
Ceci est 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>
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é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 intercepter 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 à https://dom.spec.whatwg.org/ - à partir de la v4.0.0, toutes les fonctionnalités sont implémentées avec les déviations mineures mais inévitables suivantes 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 la cohérence avec la spécification. Tenter d'utiliser des 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 de ce dépôt est disponible à 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èle, 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 à ces 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 minimales ou nulles seront nécessaires à votre code.
Jetez un œil aux benchmarks sur la branche php84-benchmark par vous-même : la plupart des opérations enregistrent une augmentation de vitesse de 90 % ou plus en passant à l'implémentation native !
Plus d'informations seront présentées dans le readme lorsque davantage de travaux auront été réalisés vers une implémentation des classes natives.