htmlentities() vs. htmlspecialchars(): PHP में एस्केपिंग के दो महारथी
\n\nअगर आपने कभी वेब पेज पर यूज़र के डेटा को दिखाया है, तो आपने htmlentities() और htmlspecialchars() फंक्शन के बारे में ज़रूर सुना होगा। ये PHP में XSS अटैक से बचाव और HTML कैरेक्टर्स को सही तरीके से दिखाने के दो मुख्य टूल हैं। लेकिन इनमें आखिर अंतर क्या है? शुरुआती को कौन सा इस्तेमाल करना चाहिए और एक्सपर्ट को कौन सा? चलिए, इसे हमेशा के लिए समझ लेते हैं।
सोचिए: आप PHP में एक ब्लॉग बना रहे हैं, और एक यूज़र कमेंट करता है: <script>alert('XSS')</script>। अगर आप इसे सीधे स्क्रीन पर दिखा देंगे, तो ब्राउज़र यह स्क्रिप्ट चला देगा। यह एक आपदा होगी! यहाँ पर htmlspecialchars() और htmlentities() काम आते हैं। लेकिन दोनों का काम करने का तरीका अलग है।
htmlspecialchars() और htmlentities() में क्या समानता है?
\n\nदोनों फंक्शन खास HTML कैरेक्टर्स को उनकी HTML entities में बदल देते हैं। उदाहरण के लिए:
\n- \n
&(एम्परसेंड) →&\n <(से कम) →<\n >(से अधिक) →>\n "(डबल कोट) →"\n '(सिंगल कोट) →'(या फ्लैग के हिसाब से') \n
इनके बिना, कोण कोष्ठक या एम्परसेंड वाला कोई भी इनपुट आपकी वेबसाइट का लेआउट बिगाड़ सकता है या हैकर्स के लिए दरवाजा खोल सकता है।
\n\nमुख्य अंतर: बदलाव का दायरा
\n\nयहीं पर असली रहस्य छिपा है। htmlspecialchars() एक किफायती योद्धा है। यह केवल पाँच मुख्य कैरेक्टर्स को बदलता है जिनका HTML में सीधा महत्व है:
- \n
&→&\n <→<\n >→>\n "→"\n '→'(अगरENT_QUOTESफ्लैग ऑन हो) \n
जबकि htmlentities() एक परफेक्शनिस्ट है। यह सभी उन कैरेक्टर्स को बदलता है जिनके लिए HTML entities मौजूद हैं। इसमें सिर्फ कोण कोष्ठक ही नहीं, बल्कि मुद्रा चिह्न (€, £, ¥), गणितीय चिह्न (∑, ∂), डायक्रिटिकल मार्क्स वाले अक्षर (é, ñ, ü) और यहाँ तक कि इमोजी (☺) भी शामिल हैं।
आसान उदाहरण: व्यवहार में अंतर
\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परिणाम:
\nhtmlspecialchars: 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परिणाम:
\nhtmlspecialchars: € 100 <b>bold</b>\nhtmlentities: € 100 <b>bold</b>\n\nदेखा? htmlentities() ने यूरो चिह्न "€" को उसकी entity € में बदल दिया। जबकि htmlspecialchars() ने इसे ज्यों का त्यों छोड़ दिया। क्यों? क्योंकि "€" HTML के लिए कोई खतरनाक कैरेक्टर नहीं है — ब्राउज़र इसे बिना एस्केपिंग के भी सही दिखा देगा।
htmlspecialchars() का उपयोग कब करें?
\n\nयह आपकी डिफ़ॉल्ट पसंद होनी चाहिए। 99% मामलों में जब आप यूज़र का डेटा दिखा रहे हों, तो htmlspecialchars() का इस्तेमाल करें। यह तेज़ है, कम मेमोरी लेता है, और XSS से बचाने के लिए पर्याप्त है।