htmlentities() बनाम htmlspecialchars(): उदाहरणों के साथ विस्तृत गाइड
\n\nक्या आपने कभी सोचा है कि PHP में दो फ़ंक्शन क्यों हैं जो एक ही काम करते प्रतीत होते हैं? htmlentities() और htmlspecialchars() — ये दो जुड़वाँ भाइयों की तरह हैं: दिखने में समान, लेकिन स्वभाव अलग। और इनके बीच चुनाव या तो आपका सुपरहीरो कौशल बन सकता है या सिरदर्द का कारण।
यदि आपने कभी Stack Overflow पर यह प्रश्न पूछा है (और ऐसे हज़ारों लोग हैं!), तो आप जानते हैं कि उत्तर हमेशा स्पष्ट नहीं होता। आज हम एक बार और हमेशा के लिए समझेंगे कि कौन सा फ़ंक्शन किसके लिए है, प्रत्येक का उपयोग कब करना है, और एन्कोडिंग के साथ गलती कैसे न करें।
\n\nचलिए शुरू करते हैं!
\n\nये फ़ंक्शन वास्तव में क्या करते हैं?
\n\nदोनों फ़ंक्शन HTML वर्णों को एस्केप करने के लिए डिज़ाइन किए गए हैं। सरल शब्दों में: वे विशेष वर्णों को उनकी HTML संस्थाओं में बदल देते हैं, ताकि ब्राउज़र उन्हें कोड के रूप में व्याख्या करने के बजाय टेक्स्ट के रूप में प्रदर्शित करे।
\n\nउदाहरण के लिए, < वर्ण < में बदल जाता है। यह इसके लिए महत्वपूर्ण है:
- \n
- सुरक्षा — XSS हमलों (क्रॉस-साइट स्क्रिप्टिंग) से बचाव \n
- सही प्रदर्शन — ताकि आपका टेक्स्ट HTML मार्कअप को "तोड़" न दे \n
लेकिन यहाँ पेच है: htmlspecialchars() केवल चार वर्णों के साथ काम करता है, जबकि htmlentities() सभी ज्ञात HTML संस्थाओं के साथ काम करता है।
htmlspecialchars(): हल्की तोपखाना
\n\nफ़ंक्शन htmlspecialchars() केवल इन वर्णों को रूपांतरित करता है:
- \n
&(एम्परसेंड) →&\n "(दोहरा उद्धरण) →"(यदि ENT_NOQUOTES फ़्लैग सेट नहीं है) \n '(एकल उद्धरण) →'(यदि ENT_QUOTES फ़्लैग सेट है) \n <(से कम) →<\n >(से अधिक) →>\n
यह सेट 99% मामलों के लिए पर्याप्त है। क्यों? क्योंकि केवल इन वर्णों का HTML मार्कअप में विशेष अर्थ होता है और ये आपके पेज को तोड़ सकते हैं।
\n\n<?php\n$user_input = '<script>alert("XSS")</script>';\necho htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');\n// आउटपुट: <script>alert("XSS")</script>\n?>\n\nhtmlentities(): भारी घुड़सवार सेना
\n\nhtmlentities() — वह पूर्णतावादी है जो सभी वर्णों को संस्थाओं में बदल देता है जिनका HTML समकक्ष है। उदाहरण के लिए, मुद्रा चिह्न (€, £, ¥), गणितीय चिह्न (∑, ∞, √) और यहाँ तक कि तीर (←, ↑) भी।
<?php\n$text = 'लागत: 50€';\necho htmlentities($text, ENT_QUOTES, 'UTF-8');\n// आउटपुट: लागत: 50€\n?>\n\nसुविधाजनक लगता है, है ना? लेकिन एक बारीकी है — प्रदर्शन। htmlentities() धीमी गति से काम करता है क्योंकि यह अधिक वर्णों को संसाधित करता है। और यदि आपकी साइट हज़ारों पंक्तियों को संसाधित करती है, तो अंतर ध्यान देने योग्य हो जाता है।
मुख्य अंतर: एन्कोडिंग
\n\nऔर यहाँ हम सबसे महत्वपूर्ण बिंदु पर आते हैं। दोनों फ़ंक्शन तीसरा पैरामीटर — एन्कोडिंग लेते हैं। और यदि आप इसे निर्दिष्ट नहीं करते हैं, तो PHP php.ini में default_charset निर्देश से मान का उपयोग करेगा (आमतौर पर यह UTF-8 है)।
लेकिन htmlentities() एन्कोडिंग के प्रति विशेष रूप से संवेदनशील है। यदि आप गलत एन्कोडिंग निर्दिष्ट करते हैं, तो फ़ंक्शन वर्णों को गलत तरीके से रूपांतरित कर सकता है। उदाहरण के लिए, ISO-8859-1 के साथ, कुछ UTF-8 वर्ण खो जाएँगे।
<?php\n// खराब उदाहरण: एन्कोडिंग निर्दिष्ट नहीं है\necho htmlentities('नमस्ते, दुनिया!'); // चेतावनी दे सकता है\n\n// अच्छा उदाहरण: हमेशा एन्कोडिंग निर्दिष्ट करें\necho htmlentities('नमस्ते, दुनिया!', ENT_QUOTES, 'UTF-8');\n?>\n\nकब क्या उपयोग करें?
\n\n