
Workflow sandbox do GitHub Actions para reprodução do CVE-2025-46820
Construído sobre o DOMDocument nativo do PHP, este projeto fornece acesso a APIs DOM modernas, como você esperaria ao trabalhar com código client-side no navegador.
Realizar manipulação de DOM no seu código server-side melhora a forma como páginas dinâmicas podem ser construídas. Utilizar uma interface padronizada e orientada a objetos 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 mostrado aqui é apenas ilustrativo, mas usar o DOM para definir dados diretamente nos valores dos elementos acopla fortemente a lógica à view, o que é considerado má prática. Consulte a biblioteca DomTemplate para uma solução mais robusta de vinculação de dados ao DOM.
Considere uma página com um formulário, contendo um elemento de entrada para digitar o seu nome. Quando o formulário é enviado, a página deve cumprimentá-lo pelo seu nome.
Este é um exemplo simples de como arquivos HTML de origem podem ser tratados como templates. Isso pode ser facilmente aplicado a páginas de template mais avançadas para fornecer conteúdo dinâmico, sem exigir técnicas não padronizadas como {{chaves curvas}} para placeholders, ou a construção de HTML propensa a erros como echo '<div class='easy-mistake'>' . $content['opa'] . '</div>' a partir do PHP.
name.html)<!doctype html>
<h1>
Olá, <span class="name-output">você</span> !
</h1>
<form>
<input name="name" placeholder="Seu nome, por favor" required />
<button>Enviar</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 de HTMLElement, como HTMLAnchorElement (<a>), HTMLButtonElement (<button>), HTMLInputElement (<input>), HTMLTableSectionElement (<thead>, <tbody>, <tfoot>), etc. O tipo específico pode ser detectado com Element::getElementType(), que retorna um dos valores do enum ElementType.DOMException para capturar diferentes tipos de exceção, 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 é implementada com os seguintes desvios menores, porém inevitáveis, do padrão:
tagName dos elementos está em maiúsculas.HTMLElement, Element::getElementType() deve ser chamado - não há subclasses de Element disponíveis para uso com instanceof, por exemplo.HTMLInputElement::files retorna um FileList que enumera todos os arquivos selecionados pelo usuário através da interface do navegador. Esse tipo de funcionalidade é impossível de implementar no lado do servidor, mas foi simulado (stubbed) para consistência com a especificação. Tentar usar funcionalidades client-side 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 do repositório está disponível em https://php.gt/domtemplate, que adiciona templates de página e vinculação de dados através de elementos personalizados e atributos de template, introduzindo funcionalidades server-side semelhantes às dos WebComponents.
Desde o lançamento do PHP 8.4, uma nova classe nativa HTMLDocument foi incluída no PHP. Com essas ligações nativas, todas as operações são muito mais rápidas. O trabalho foi iniciado para fazer a implementação do Dom do PHPGT utilizar o novo código nativo. Felizmente, o DOM é um padrão muito bem definido, então, independentemente do que acontecer, mudanças mínimas ou nenhuma serão necessárias no seu código.
Dê uma olhada nos benchmarks no branch php84-benchmark por conta própria: a maioria das operações registrou 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.