परिचय: आपकी PHP साइट अभी क्यों हैक हो सकती है?
\nएक स्थिति की कल्पना करें: आपने PHP में एक शानदार साइट, फीडबैक फॉर्म, टिप्पणियाँ और व्यक्तिगत खाता बनाया। सब कुछ काम कर रहा है। लेकिन एक दिन आप एडमिन पैनल में जाते हैं और वहाँ कुछ नहीं है। या इससे भी बुरा: साइट पर कैसीनो का विज्ञापन दिखाई देता है, और Google ने आपके संसाधन को ब्लॉक कर दिया है। परिचित लगता है? बुराई की जड़ उपयोगकर्ता इनपुट का गलत प्रसंस्करण है।
\nप्रश्न "How can I sanitize user input with PHP?" Stack Overflow पर सबसे लोकप्रिय प्रश्नों में से एक है। हजारों डेवलपर एक ही गलतियाँ करते हैं। इस लेख में हम शीर्ष त्रुटियों का विश्लेषण करेंगे जो अनुभवी प्रोग्रामर भी करते हैं, और दिखाएंगे कि उनसे कैसे बचा जाए। आप जानेंगे कि XSS, SQL-इंजेक्शन और अन्य हमलों से कैसे बचाव करें। चलिए शुरू करते हैं!
\n\nत्रुटि #1: हर चीज़ के लिए mysql_real_escape_string() का उपयोग करना
\nपुरानी स्कूल: कई डेवलपर अब भी सोचते हैं कि सभी डेटा को mysql_real_escape_string() में लपेटने से समस्या हल हो जाती है। यह एक बड़ी गलती है। यह फ़ंक्शन केवल SQL क्वेरी में स्ट्रिंग को एस्केप करने के लिए है, और वह भी पुराने mysql_* एक्सटेंशन के लिए, जिसे PHP 7 में ही हटा दिया गया था।
गलत कोड का उदाहरण:
\n<?php\n$name = mysql_real_escape_string($_POST['name']);\n$query = "INSERT INTO users (name) VALUES ('$name')";\n$result = mysql_query($query);\n?>\nयह खराब क्यों है:
\n- \n
- यह फ़ंक्शन XSS हमलों (जैसे JavaScript डालना) से बचाव नहीं करता। \n
mysql_*एक्सटेंशन पुराना और असुरक्षित है। \n - आप एस्केपिंग लॉजिक को बिज़नेस लॉजिक के साथ मिला रहे हैं। \n
समाधान: PDO या MySQLi के माध्यम से तैयार क्वेरी (prepared statements) का उपयोग करें। और स्क्रीन पर डेटा प्रदर्शित करने के लिए अलग सैनिटाइज़ेशन करें।
\n\nत्रुटि #2: डेटा प्रदर्शित करते समय XSS हमलों को अनदेखा करना
\nसबसे आम गलती। आपने डेटा प्राप्त किया, DB में सहेजा और बस echo या print के माध्यम से प्रदर्शित कर दिया। वोइला — हमलावर एक स्क्रिप्ट डाल सकता है जो कुकीज़ चुरा ले, उपयोगकर्ता को रीडायरेक्ट करे या लेआउट खराब करे।
असुरक्षित कोड का उदाहरण:
\n<?php\necho "<p>नमस्ते, " . $_GET['name'] . "!</p>";\n?>\nयदि URL में ?name=<script>alert('XSS')</script> भेजा जाए, तो स्क्रिप्ट निष्पादित हो जाएगी।
समाधान: htmlspecialchars() फ़ंक्शन का उपयोग ENT_QUOTES पैरामीटर के साथ करें:
<?php\n$name = htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');\necho "<p>नमस्ते, " . $name . "!</p>";\n?>\nमहत्वपूर्ण: सैनिटाइज़ेशन प्रदर्शित करने के समय करना चाहिए, सहेजने के समय नहीं। यदि आप DB में वर्ण बदलते हैं, तो आप मूल डेटा खो देंगे।
\n\nत्रुटि #3: strip_tags() के माध्यम से अंधा फ़िल्टरेशन
\nकई लोग सोचते हैं: "ओह, बस सभी HTML टैग हटा दो — और काम खत्म।" लेकिन strip_tags() कोई रामबाण नहीं है। पहला, यह केवल टैग हटाता है, लेकिन एट्रीब्यूट (जैसे onclick) छोड़ देता है। दूसरा, यदि आपको कुछ टैग (जैसे <b> या <i>) की अनुमति देनी है, तो strip_tags() असुविधाजनक हो जाता है।
उदाहरण:
\n<?php\n$comment = strip_tags($_POST['comment']);\necho $comment; // <script> हटा देगा, लेकिन <a onclick="..."> छोड़ देगा\n?>\nसमाधान: सामान्य टेक्स्ट के लिए htmlspecialchars() का उपयोग करें या यदि विशिष्ट टैग की अनुमति देनी है तो HTML Purifier जैसी लाइब्रेरी का उपयोग करें। HTML Purifier न केवल टैग बल्कि एट्रीब्यूट, स्टाइल और CSS की भी जाँच करता है।
त्रुटि #4: ईमेल, URL और संख्याओं का सत्यापन न करना
\nसैनिटाइज़ेशन केवल XSS के बारे में नहीं है। यदि आप ईमेल की उम्मीद कर रहे हैं और "123" स्ट्रिंग प्राप्त करते हैं, तो यह त्रुटियाँ पैदा कर सकता है। या यदि आप बिना जाँच के URL सहेजते हैं, तो हमलावर javascript:alert(1) डाल सकता है।