
GitHub Actions 워크플로우 샌드박스 for CVE-2025-46820 재현
PHP의 네이티브 DOMDocument 위에 구축된 이 프로젝트는 브라우저에서 클라이언트 측 코드로 작업할 때 기대할 수 있는 현대적인 DOM API에 대한 접근을 제공합니다.
서버 측 코드에서 DOM 조작을 수행하면 동적 페이지를 구축하는 방식을 향상시킬 수 있습니다. 표준화된 객체 지향 인터페이스를 활용하면 페이지를 사전 처리할 수 있어 브라우저, 웹 서버 및 콘텐츠 전송 네트워크에 이점을 제공합니다.
중요 참고 사항: 여기에 표시된 예시는 설명 목적으로만 제공되지만, DOM을 사용하여 요소의 값에 직접 데이터를 설정하는 것은 로직을 뷰에 밀접하게 결합시키므로 좋지 않은 관행으로 간주됩니다. DOM에 데이터를 바인딩하는 더 견고한 솔루션은 DomTemplate 라이브러리를 참조하세요.
이름을 입력하는 input 요소가 있는 양식이 포함된 페이지를 생각해 보세요. 양식이 제출되면 페이지는 이름으로 당신에게 인사해야 합니다.
이것은 소스 HTML 파일을 템플릿으로 취급할 수 있는 방법의 간단한 예시입니다. 이는 {{중괄호}}와 같은 비표준 기술을 사용하거나 PHP 내에서 오류가 발생하기 쉬운 echo '<div class='easy-mistake'>' . $content['opa'] . '</div>' HTML 구문을 사용하지 않고도 동적 콘텐츠를 제공하기 위해 더 고급 템플릿 페이지에 쉽게 적용할 수 있습니다.
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 타입은 HTMLAnchorElement(<a>), HTMLButtonElement(<button>), HTMLInputElement(<input>), HTMLTableSectionElement(<thead>, <tbody>, <tfoot>) 등과 같은 모든 HTMLElement 사양을 나타냅니다. 특정 타입은 ElementType 열거형 값 중 하나를 반환하는 Element::getElementType()으로 감지할 수 있습니다.EnumeratedValueException, HierarchyRequestError, IndexSizeException 등 다양한 유형의 예외를 포착하기 위한 DOMException 확장.FileList, StyleSheet, VideoTrackList, WindowProxy 등의 클래스를 포함한 클라이언트 측 기능 스텁.Element::querySelector() 및 (Element::querySelectorAll())를 통해 CSS 선택기를 사용하여 요소 참조ClassList를 사용하여 요소의 클래스 추가/제거/토글Element::previousElementSibling, Element::nextElementSibling, Element::children, Element::lastElementChild 및 firstElementChild 등을 사용하여 Element 전용 노드 탐색ChildNode::remove(), ChildNode::before, ChildNode::after, ChildNode::replaceWith()를 사용하여 자식 노드 삽입 및 제거HTMLDocument의 표준 속성:
이 저장소는 https://dom.spec.whatwg.org/ 의 DOM 사양에 최대한 정확하게 맞추는 것을 목표로 합니다. v4.0.0 기준으로 모든 기능이 구현되어 있으며, 표준과의 다음과 같은 사소하지만 불가피한 차이점이 있습니다:
tagName 속성은 대문자입니다.HTMLElement 타입을 확인하려면 Element::getElementType()을 호출해야 합니다. 예를 들어 instanceof와 함께 사용할 수 있는 Element의 하위 클래스는 없습니다.HTMLInputElement::files는 브라우저 인터페이스를 통해 사용자가 선택한 모든 파일을 열거하는 FileList를 반환합니다. 이러한 종류의 기능은 서버 측에서 구현하는 것이 불가능하지만 사양과의 일관성을 위해 스텁 처리되었습니다. 이 라이브러리 내에서 클라이언트 측 기능을 사용하려고 하면 ClientSideOnlyFunctionalityException이 발생합니다.이 저장소는 DOM 사양에 최대한 정확하게 맞추는 것을 목표로 합니다. 저장소의 확장은 https://php.gt/domtemplate 에서 제공되며, 사용자 정의 요소와 템플릿 속성을 통해 페이지 템플릿 및 데이터 바인딩을 추가하여 WebComponents와 같은 서버 측 기능을 도입합니다.
PHP 8.4 릴리스 이후, PHP에 네이티브로 제공되는 새로운 HTMLDocument 클래스가 추가되었습니다. 네이티브 바인딩이 있으므로 모든 작업이 훨씬 빠릅니다. PHPGT의 Dom 구현이 새로운 네이티브 코드를 활용하도록 하는 작업이 시작되었습니다. 다행히도 DOM은 매우 잘 정의된 표준이므로 어떤 일이 발생하든 코드에 최소한의 변경 또는 변경이 필요하지 않습니다.
php84-benchmark 브랜치의 벤치마크를 직접 확인해 보세요: 대부분의 작업이 네이티브 구현으로 전환함으로써 90% 이상의 속도 향상이 기록되었습니다!
네이티브 클래스 구현을 향한 더 많은 작업이 진행되면 추가 정보가 readme에 제공될 것입니다.