
# Laboratorio de investigación de seguridad autorizado que reproduce CVE-2025-46820 (GHSA-cwj7-6v67-2cm4): GITHUB_TOKEN persistido en artefactos de CI descargables públicamente en phpgt/Dom. Instantánea de phpgt/Dom @ b73d7e8.
Artefacto de investigación automatizado — no es el proyecto original.
Este repositorio es un laboratorio desechable construido por un sistema automatizado para una tesis de maestría en Université Laval sobre la reproducción de vulnerabilidades publicadas en flujos de trabajo de GitHub Actions. Es una instantánea verbatim de
phpgt/Domen el commitb73d7e8b54963796132df99902c3224016511bb9(2025-03-21), redistribuida bajo la licencia de ese proyecto, cuyo archivo se incluye sin cambios en esta instantánea.El proyecto original no está involucrado, nunca es el objetivo, y la vulnerabilidad estudiada aquí ya es pública. Cada secreto y variable en este repositorio es un valor ficticio generado aleatoriamente — no hay ninguna credencial real presente. Las referencias de acciones e imágenes de ejecutores están fijadas a lo que resolvieron el 2025-03-21; consulte
pinning.mden la salida del sistema para cada cambio realizado en la instantánea.Preguntas u objeciones: [email protected]
Construido sobre el DOMDocument nativo de PHP, este proyecto proporciona acceso a las API DOM modernas, tal como esperarías al trabajar con código del lado del cliente en el navegador.
Realizar manipulación del DOM en tu código del lado del servidor mejora la forma en que se pueden construir páginas dinámicas. Utilizar una interfaz orientada a objetos estandarizada significa que la página puede procesarse previamente, beneficiando a navegadores, servidores web y redes de entrega de contenido.
Nota importante: el ejemplo mostrado aquí es solo con fines ilustrativos, pero usar el DOM para establecer datos directamente en los valores de los elementos acopla estrechamente la lógica a la vista, lo que se considera una mala práctica. Consulta la biblioteca DomTemplate para una solución más robusta para vincular datos al DOM.
Considera una página con un formulario, con un elemento de entrada para escribir tu nombre. Cuando se envía el formulario, la página debería saludarte por tu nombre.
Este es un ejemplo sencillo de cómo los archivos HTML de origen pueden tratarse como plantillas. Esto puede aplicarse fácilmente a páginas de plantillas más avanzadas para proporcionar contenido dinámico, sin requerir técnicas no estándar como {{llaves curvas}} para marcadores de posición, o la construcción de HTML propensa a errores mediante echo '<div class='easy-mistake'>' . $content['opa'] . '</div>' desde 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 representa todas las especificaciones de HTMLElement, como HTMLAnchorElement (<a>), HTMLButtonElement (<button>), HTMLInputElement (<input>), HTMLTableSectionElement (<thead>, <tbody>, <tfoot>), etc. El tipo particular se puede detectar con Element::getElementType(), que devuelve uno de los valores del enum ElementType.DOMException para capturar diferentes tipos de excepción, como EnumeratedValueException, HierarchyRequestError, IndexSizeException, etc.FileList, StyleSheet, VideoTrackList, WindowProxy, etc.Element::querySelector() y (Element::querySelectorAll())ClassListElement::previousElementSibling, Element::nextElementSibling, Element::children y Element::lastElementChild y firstElementChild, etc.HTMLDocument:
Este repositorio tiene como objetivo ser lo más preciso posible con la especificación DOM en https://dom.spec.whatwg.org/ - a partir de la v4.0.0 toda la funcionalidad está implementada con las siguientes desviaciones menores pero inevitables del estándar:
tagName de los elementos está en mayúsculas.HTMLElement, se debe llamar a Element::getElementType() - no hay subclases de Element disponibles para usar con instanceof, por ejemplo.HTMLInputElement::files devuelve un FileList que enumera todos los archivos seleccionados por el usuario a través de la interfaz del navegador. Este tipo de funcionalidad es imposible de implementar en el lado del servidor, pero se ha simulado para mantener la coherencia con la especificación. Intentar usar funcionalidad del lado del cliente dentro de esta biblioteca lanza una ClientSideOnlyFunctionalityException.Este repositorio pretende ser lo más preciso posible con la especificación DOM. Una extensión del repositorio está disponible en https://php.gt/domtemplate que añade plantillas de página y vinculación de datos mediante elementos personalizados y atributos de plantilla, introduciendo funcionalidad del lado del servidor similar a la de WebComponents.
Desde el lanzamiento de PHP 8.4, hay una nueva clase nativa HTMLDocument incluida en PHP de forma nativa. Al tener enlaces nativos, todas las operaciones son mucho más rápidas. Se ha comenzado a trabajar para que la implementación de Dom de PHPGT utilice el nuevo código nativo. Afortunadamente, el DOM es un estándar muy bien definido, por lo que pase lo que pase, se requerirán cambios mínimos o nulos en tu código.
Echa un vistazo a los benchmarks en la rama php84-benchmark por ti mismo: la mayoría de las operaciones registran un aumento de velocidad del 90% o más al cambiar a la implementación nativa.
Se proporcionará más información en el readme cuando se haya avanzado más hacia una implementación de las clases nativas.