
# Laboratório de pesquisa de segurança autorizado reproduzindo CVE-2025-46820 (GHSA-cwj7-6v67-2cm4): GITHUB_TOKEN persistido em artefatos de CI publicamente baixáveis em phpgt/Dom. Snapshot de phpgt/Dom @ b73d7e8.
Artefacto de pesquisa automatizado — não é o projeto original.
Este repositório é um laboratório descartável construído por um sistema automatizado para uma tese de mestrado na Université Laval sobre a reprodução de vulnerabilidades publicadas em workflows do GitHub Actions. É um instantâneo verbatim de
phpgt/Domno commitb73d7e8b54963796132df99902c3224016511bb9(2025-03-21), redistribuído sob a licença desse próprio projeto, cujo ficheiro está incluído inalterado neste instantâneo.O projeto original não está envolvido, nunca é alvo, e a vulnerabilidade aqui estudada já é pública. Todos os segredos e variáveis neste repositório são valores fictícios gerados aleatoriamente — nenhuma credencial real está presente. As referências a ações e imagens de runners estão fixadas ao que resolviam em 2025-03-21; consulte
pinning.mdna saída do sistema para todas as alterações feitas ao instantâneo.Perguntas ou objeções: [email protected]
Construído sobre o DOMDocument nativo do PHP, este projeto fornece acesso a APIs DOM modernas, tal como esperaria ao trabalhar com código do lado do cliente no navegador.
Realizar manipulação de DOM no seu código do lado do servidor melhora a forma como as páginas dinâmicas podem ser construídas. Utilizar uma interface orientada a objetos padronizada significa que a página pode ser pré-processada, beneficiando navegadores, servidores web e redes de distribuição de conteúdo.
Nota importante: o exemplo aqui apresentado é meramente ilustrativo, mas usar o DOM para definir diretamente dados nos valores dos elementos acopla fortemente a lógica à vista, o que é considerado uma má prática. Consulte a biblioteca DomTemplate para uma solução mais robusta de ligação de dados ao DOM.
Considere uma página com um formulário, com um elemento de entrada para introduzir o seu nome. Quando o formulário é submetido, a página deve saudá-lo pelo seu nome.
Este é um exemplo simples de como ficheiros HTML de origem podem ser tratados como modelos. Isto pode ser facilmente aplicado a páginas de modelo mais avançadas para fornecer conteúdo dinâmico, sem exigir técnicas não padronizadas como {{chavetas}} para espaços reservados, ou construção de HTML propensa a erros como echo '<div class='easy-mistake'>' . $content['opa'] . '</div>' a partir de dentro do 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 as especificações HTMLElement, tais como HTMLAnchorElement (<a>), HTMLButtonElement (<button>), HTMLInputElement (<input>), HTMLTableSectionElement (<thead>, <tbody>, <tfoot>), etc. O tipo específico pode ser detetado com Element::getElementType(), que devolve um dos valores do enum ElementType.DOMException para capturar diferentes tipos de exceção, tais como EnumeratedValueException, HierarchyRequestError, IndexSizeException, etc.FileList, StyleSheet, VideoTrackList, WindowProxy, etc.Element::querySelector() e (Element::querySelectorAll())ClassListElement::previousElementSibling, Element::nextElementSibling, Element::children e Element::lastElementChild e firstElementChild, etc.HTMLDocument:
Este repositório visa ser o mais preciso possível em relação à especificação DOM em https://dom.spec.whatwg.org/ - a partir da v4.0.0 toda a funcionalidade está implementada com as seguintes pequenas mas inevitáveis divergências do padrão:
tagName dos elementos está em maiúsculas.HTMLElement, Element::getElementType() deve ser chamado - não existem subclasses de Element disponíveis para uso com instanceof, por exemplo.HTMLInputElement::files devolve um FileList que enumera todos os ficheiros selecionados pelo utilizador através da interface do navegador. Este tipo de funcionalidade é impossível de implementar no lado do servidor, mas foi simulada para consistência com a especificação. Tentar usar funcionalidade do lado do cliente dentro desta biblioteca lança uma ClientSideOnlyFunctionalityException.Este repositório pretende ser o mais preciso possível em relação à especificação DOM. Uma extensão deste repositório está disponível em https://php.gt/domtemplate que adiciona modelação de páginas e ligação de dados através de elementos personalizados e atributos de modelo, introduzindo funcionalidade do lado do servidor semelhante à dos WebComponents.
Desde o lançamento do PHP 8.4, existe uma nova classe nativa HTMLDocument incluída no PHP. Com estas ligações nativas, todas as operações são muito mais rápidas. Foi iniciado trabalho para fazer a implementação Dom do PHPGT utilizar o novo código nativo. Felizmente, o DOM é um padrão muito bem definido, por isso, aconteça o que acontecer, serão necessárias alterações mínimas ou nenhumas ao seu código.
Veja os benchmarks no ramo php84-benchmark por si mesmo: a maioria das operações registou um aumento de velocidade de 90% ou mais ao mudar para a implementação nativa!
Mais informações serão apresentadas no readme quando mais trabalho for feito em direção a uma implementação das classes nativas.