htmlentities() vs htmlspecialchars() PHP में: पूरी जानकारी उदाहरण सहित

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

htmlentities() vs. htmlspecialchars(): PHP में एस्केपिंग के दो महारथी

\n\n

अगर आपने कभी वेब पेज पर यूज़र के डेटा को दिखाया है, तो आपने htmlentities() और htmlspecialchars() फंक्शन के बारे में ज़रूर सुना होगा। ये PHP में XSS अटैक से बचाव और HTML कैरेक्टर्स को सही तरीके से दिखाने के दो मुख्य टूल हैं। लेकिन इनमें आखिर अंतर क्या है? शुरुआती को कौन सा इस्तेमाल करना चाहिए और एक्सपर्ट को कौन सा? चलिए, इसे हमेशा के लिए समझ लेते हैं।

\n\n

सोचिए: आप PHP में एक ब्लॉग बना रहे हैं, और एक यूज़र कमेंट करता है: <script>alert('XSS')</script>। अगर आप इसे सीधे स्क्रीन पर दिखा देंगे, तो ब्राउज़र यह स्क्रिप्ट चला देगा। यह एक आपदा होगी! यहाँ पर htmlspecialchars() और htmlentities() काम आते हैं। लेकिन दोनों का काम करने का तरीका अलग है।

\n\n

htmlspecialchars() और htmlentities() में क्या समानता है?

\n\n

दोनों फंक्शन खास HTML कैरेक्टर्स को उनकी HTML entities में बदल देते हैं। उदाहरण के लिए:

\n
    \n
  • & (एम्परसेंड) → &amp;
  • \n
  • < (से कम) → &lt;
  • \n
  • > (से अधिक) → &gt;
  • \n
  • " (डबल कोट) → &quot;
  • \n
  • ' (सिंगल कोट) → &#039; (या फ्लैग के हिसाब से &apos;)
  • \n
\n\n

इनके बिना, कोण कोष्ठक या एम्परसेंड वाला कोई भी इनपुट आपकी वेबसाइट का लेआउट बिगाड़ सकता है या हैकर्स के लिए दरवाजा खोल सकता है।

\n\n

मुख्य अंतर: बदलाव का दायरा

\n\n

यहीं पर असली रहस्य छिपा है। htmlspecialchars() एक किफायती योद्धा है। यह केवल पाँच मुख्य कैरेक्टर्स को बदलता है जिनका HTML में सीधा महत्व है:

\n
    \n
  • & → &amp;
  • \n
  • < → &lt;
  • \n
  • > → &gt;
  • \n
  • " → &quot;
  • \n
  • ' → &#039; (अगर ENT_QUOTES फ्लैग ऑन हो)
  • \n
\n\n

जबकि htmlentities() एक परफेक्शनिस्ट है। यह सभी उन कैरेक्टर्स को बदलता है जिनके लिए HTML entities मौजूद हैं। इसमें सिर्फ कोण कोष्ठक ही नहीं, बल्कि मुद्रा चिह्न (€, £, ¥), गणितीय चिह्न (∑, ∂), डायक्रिटिकल मार्क्स वाले अक्षर (é, ñ, ü) और यहाँ तक कि इमोजी (☺) भी शामिल हैं।

\n\n

आसान उदाहरण: व्यवहार में अंतर

\n\n

आइए कोड देखते हैं। मान लीजिए हमारे पास फ्रेंच टेक्स्ट वाली एक स्ट्रिंग है:

\n\n
<?php\n$text = "Café & thé <script>alert('test')</script>";\necho "htmlspecialchars: " . htmlspecialchars($text, ENT_QUOTES, 'UTF-8') . "<br>";\necho "htmlentities: " . htmlentities($text, ENT_QUOTES, 'UTF-8');\n?>
\n\n

परिणाम:

\n
htmlspecialchars: Café & thé <script>alert('test')</script>\nhtmlentities: Café & thé <script>alert('test')</script>
\n\n

इस उदाहरण में कोई अंतर नहीं है, क्योंकि "é" और अन्य लैटिन अक्षरों का HTML में कोई खास मतलब नहीं है। लेकिन अब उन कैरेक्टर्स के साथ प्रयोग करते हैं जिनके पास entities हैं:

\n\n
<?php\n$text = "€ 100 <b>bold</b>";\necho "htmlspecialchars: " . htmlspecialchars($text, ENT_QUOTES, 'UTF-8') . "<br>";\necho "htmlentities: " . htmlentities($text, ENT_QUOTES, 'UTF-8');\n?>
\n\n

परिणाम:

\n
htmlspecialchars: € 100 <b>bold</b>\nhtmlentities: &euro; 100 <b>bold</b>
\n\n

देखा? htmlentities() ने यूरो चिह्न "€" को उसकी entity &euro; में बदल दिया। जबकि htmlspecialchars() ने इसे ज्यों का त्यों छोड़ दिया। क्यों? क्योंकि "€" HTML के लिए कोई खतरनाक कैरेक्टर नहीं है — ब्राउज़र इसे बिना एस्केपिंग के भी सही दिखा देगा।

\n\n

htmlspecialchars() का उपयोग कब करें?

\n\n

यह आपकी डिफ़ॉल्ट पसंद होनी चाहिए। 99% मामलों में जब आप यूज़र का डेटा दिखा रहे हों, तो htmlspecialchars() का इस्तेमाल करें। यह तेज़ है, कम मेमोरी लेता है, और XSS से बचाने के लिए पर्याप्त है।

ब्लॉग

पुस्तक अनुशंसाएँ