
अधिकृत सुरक्षा-अनुसंधान प्रयोगशाला जो CVE-2025-46820 (GHSA-cwj7-6v67-2cm4) को पुनः उत्पन्न करती है: phpgt/Dom में GITHUB_TOKEN सार्वजनिक रूप से डाउनलोड करने योग्य CI आर्टिफैक्ट्स में संग्रहीत हो गया। phpgt/Dom @ b73d7e8 का स्नैपशॉट।
स्वचालित शोध कलाकृति — अपस्ट्रीम प्रोजेक्ट नहीं।
यह रिपॉजिटरी एक स्वचालित हार्नेस द्वारा निर्मित एक डिस्पोजेबल लैब है, जो Université Laval में मास्टर की थीसिस के लिए प्रकाशित GitHub Actions वर्कफ़्लो कमज़ोरियों को पुनः प्रस्तुत करने हेतु बनाई गई है। यह
phpgt/Domका एक शब्दशः स्नैपशॉट है, जो कमिटb73d7e8b54963796132df99902c3224016511bb9(2025-03-21) पर आधारित है, और उस प्रोजेक्ट के अपने लाइसेंस के तहत पुनर्वितरित किया गया है, जिसकी फ़ाइल इस स्नैपशॉट में अपरिवर्तित शामिल है।अपस्ट्रीम प्रोजेक्ट शामिल नहीं है, उसे कभी लक्षित नहीं किया जाता है, और यहाँ अध्ययन की गई कमज़ोरी पहले से ही सार्वजनिक है। इस रिपॉजिटरी में हर सीक्रेट और वेरिएबल एक यादृच्छिक रूप से उत्पन्न डमी मान है — कोई वास्तविक क्रेडेंशियल मौजूद नहीं है। एक्शन संदर्भ और रनर इमेज उसी पर पिन किए गए हैं जो 2025-03-21 पर उन्होंने हल किया था; स्नैपशॉट में किए गए हर बदलाव के लिए हार्नेस आउटपुट में
pinning.mdदेखें।प्रश्न या आपत्तियाँ: [email protected]
PHP के मूल DOMDocument के ऊपर निर्मित, यह प्रोजेक्ट आधुनिक DOM APIs तक पहुँच प्रदान करता है, जैसा कि आप ब्राउज़र में क्लाइंट-साइड कोड के साथ काम करते समय अपेक्षा करेंगे।
अपने सर्वर-साइड कोड में DOM हेरफेर करना गतिशील पृष्ठों के निर्माण के तरीके को बेहतर बनाता है। एक मानकीकृत ऑब्जेक्ट-ओरिएंटेड इंटरफ़ेस का उपयोग करने का अर्थ है कि पृष्ठ को पहले से संसाधित किया जा सकता है, जिससे ब्राउज़र, वेबसर्वर और कंटेंट डिलीवरी नेटवर्क को लाभ मिलता है।
महत्वपूर्ण नोट: यहाँ दिखाया गया उदाहरण केवल चित्रण के उद्देश्य से है, लेकिन तत्वों के मानों में सीधे डेटा सेट करने के लिए DOM का उपयोग करना लॉजिक को व्यू से कसकर जोड़ देता है, जिसे खराब अभ्यास माना जाता है। DOM में डेटा बाइंडिंग के लिए अधिक मजबूत समाधान हेतु कृपया DomTemplate लाइब्रेरी देखें।
एक फ़ॉर्म वाले पृष्ठ पर विचार करें, जिसमें आपका नाम दर्ज करने के लिए एक इनपुट तत्व है। जब फ़ॉर्म सबमिट होता है, तो पृष्ठ को आपके नाम से आपका अभिवादन करना चाहिए।
यह एक सरल उदाहरण है कि कैसे स्रोत 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 प्रकार सभी HTMLElement विनिर्देशों का प्रतिनिधित्व करता है, जैसे HTMLAnchorElement (<a>), HTMLButtonElement (<button>), HTMLInputElement (<input>), HTMLTableSectionElement (<thead>, <tbody>, <tfoot>), आदि। विशेष प्रकार का पता Element::getElementType() से लगाया जा सकता है, जो ElementType एनम मानों में से एक लौटाता है।DOMException एक्सटेंशन, जैसे EnumeratedValueException, HierarchyRequestError, IndexSizeException, आदि।FileList, StyleSheet, VideoTrackList, WindowProxy, आदि के लिए क्लास शामिल हैं।Element::querySelector() और (Element::querySelectorAll()) के माध्यम सेClassList का उपयोग करके तत्वों के क्लास जोड़ें/हटाएँ/टॉगल करेंElement::previousElementSibling, Element::nextElementSibling, Element::children और Element::lastElementChild और firstElementChild आदि के साथ केवल-तत्व नोड्स को ट्रैवर्स करें।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 में अधिक जानकारी दी जाएगी।
ChildNode::remove()