
승인된 보안 연구 랩으로 CVE-2025-46820(GHSA-cwj7-6v67-2cm4)을 재현합니다: phpgt/Dom에서 GITHUB_TOKEN이 공개적으로 다운로드 가능한 CI 아티팩트에 유지됨. phpgt/Dom @ b73d7e8 스냅샷.
자동화된 연구 산출물 — 업스트림 프로젝트가 아님.
이 저장소는 Université Laval의 석사 논문을 위해 자동화된 하네스가 구축한 일회용 실험실로, 공개된 GitHub Actions 워크플로우 취약점 재현을 목적으로 합니다. 이는 커밋
b73d7e8b54963796132df99902c3224016511bb9(2025-03-21) 시점의phpgt/Dom에 대한 그대로의 스냅샷이며, 해당 프로젝트의 자체 라이선스에 따라 재배포되며, 해당 라이선스 파일은 이 스냅샷에 변경 없이 포함되어 있습니다.업스트림 프로젝트는 이와 관련이 없으며, 결코 공격 대상이 아닙니다. 여기서 연구된 취약점은 이미 공개된 상태입니다. 이 저장소의 모든 시크릿과 변수는 무작위로 생성된 더미 값입니다 — 실제 자격 증명은 존재하지 않습니다. 액션 참조와 러너 이미지는 2025-03-21에 확인된 값으로 고정되어 있습니다. 스냅샷에 적용된 모든 변경 사항은 하네스 출력의
pinning.md를 참조하세요.질문 또는 이의 제기: [email protected]
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(), , , 를 사용한 자식 노드 삽입 및 제거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에 게시될 것입니다.