"मैं तो सिर्फ कोट्स को एस्केप कर रहा हूँ": आपका कोड असुरक्षित क्यों है
\n\nअगर आपने कभी गूगल पर "How can I sanitize user input with PHP?" सर्च किया है, तो आप अकेले नहीं हैं। Stack Overflow पर इस सवाल को लाखों बार देखा जा चुका है। और इसमें कोई हैरानी नहीं: सुरक्षा का विषय वेब डेवलपमेंट में सबसे गर्मागर्म मुद्दों में से एक है।
\n\nलेकिन यहाँ एक विरोधाभास है: उस सवाल के ज़्यादातर जवाब या तो पुराने हो चुके हैं या खतरनाक हैं। डेवलपर्स आज भी mysql_real_escape_string() (जो 10 साल पहले हटा दी गई) जैसी चीज़ें लिखते हैं या बस "खतरनाक" कैरेक्टर्स को हटा देते हैं। स्पॉइलर: यह काम नहीं करता।
इस लेख में हम PHP में यूज़र इनपुट सैनिटाइज़ेशन की टॉप-5 गलतियाँ देखेंगे जो आपकी साइट को छलनी बना देती हैं, और सीखेंगे कि उन्हें हमेशा के लिए कैसे ठीक करें।
\n\nगलती नंबर 1: "सैनिटाइज़ेशन" को सबका इलाज मानना
\n\nसबसे बड़ी गलती यह सोचना है कि एक ही फंक्शन सभी डेटा को "साफ़" कर सकता है। यहाँ एक नौसिखिए का टिपिकल कोड है:
\n\n<?php\n$name = $_POST['name'];\n$name = strip_tags($name);\n$name = addslashes($name);\n// अब डेटा सुरक्षित है? नहीं!\n?>\n\nसमस्या यह है कि अलग-अलग संदर्भों में अलग-अलग प्रोसेसिंग की ज़रूरत होती है। वैलिडेशन (फ़ॉर्मेट की जाँच) और सैनिटाइज़ेशन (सफाई) एक ही चीज़ नहीं हैं। और आउटपुट एस्केपिंग तो बिल्कुल अलग जगह होती है।
\n\nसही तरीका: तय करें कि आप हर स्टेज पर डेटा के साथ क्या कर रहे हैं। डेटाबेस के लिए अलग, HTML के लिए अलग, JSON के लिए और अलग।
\n\nगलती नंबर 2: पुराने फंक्शन का उपयोग (या गलत तरीके से इस्तेमाल)
\n\nआइए PHP सुरक्षा के "डायनासोर" पर एक नज़र डालते हैं:
\n\n- \n
mysql_real_escape_string()— PHP 7.0 में हटा दिया गया। भूल जाइए। \n addslashes()— सभी SQL इंजेक्शन से नहीं बचाता, खासकर मल्टीबाइट एन्कोडिंग में। \n strip_tags()— टैग हटाता है, लेकिन आउटपुट को एस्केप नहीं करता। XSS अट्रीब्यूट के ज़रिए भी संभव है। \n
खतरनाक कोड का उदाहरण जो आज भी मिलता है:
\n\n<?php\n$id = $_GET['id'];\n$id = addslashes($id);\n$query = "SELECT * FROM users WHERE id = '$id'";\n// अगर id = 1 OR 1=1 -- तो आप हैक हो गए\n?>\n\nसही तरीका: प्रिपेयर्ड स्टेटमेंट (prepared statements) का उपयोग करें। SQL इंजेक्शन से बचने का यही एकमात्र भरोसेमंद तरीका है।
\n\n<?php\n$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");\n$stmt->execute(['id' => $_GET['id']]);\n?>\n\nदेखा? SQL के लिए कोई सैनिटाइज़ेशन नहीं। बस पैरामीटर। डेटाबेस खुद तय करेगा कि डेटा क्या है और कमांड क्या।
\n\nगलती नंबर 3: वैलिडेशन और सैनिटाइज़ेशन में उलझन
\n\nबहुत से लोग सोचते हैं: "मैं सभी संदिग्ध कैरेक्टर हटा दूँगा, और सब सुरक्षित हो जाएगा।" लेकिन इससे एप्लिकेशन का लॉजिक टूट जाता है। सोचिए, अगर यूज़र ने पासवर्ड P@ssw0rd! डाला और आपने @ और ! हटा दिए। पासवर्ड बन गया Pssw0rd — और यूज़र अब लॉगिन नहीं कर सकता।
वैलिडेशन — जाँचता है कि इनपुट अपेक्षित फ़ॉर्मेट में है या नहीं (ईमेल, नंबर, URL)। अगर नहीं, तो अस्वीकार करें।
\n\nसैनिटाइज़ेशन — अवांछित कैरेक्टर हटाता या बदलता है, लेकिन सिर्फ तब जब वास्तव में ज़रूरत हो (जैसे फ़ाइल नाम के लिए)।
\n\nईमेल वैलिडेशन का सही उदाहरण:
\n\n<?php\n$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);\nif ($email === false) {\n // ईमेल अमान्य है — न सेव करें, न आउटपुट करें\n echo "कृपया सही ईमेल डालें";\n exit;\n}\n// अब $email किसी भी उद्देश्य के लिए सुरक्षित स्ट्रिंग है\n?>\n\nसुनहरा नियम: अगर आपको नंबर चाहिए — जाँचें कि वह नंबर है। अगर ईमेल चाहिए — फ़ॉर्मेट जाँचें। बाकी सब अस्वीकार करें।
\n\nगलती नंबर 4: आउटपुट कॉन्टेक्स्ट को नज़रअंदाज़ करना (XSS)
\n\nआपने प्रिपेयर्ड स्टेटमेंट के ज़रिए डेटा को डेटाबेस में सेव कर लिया। बधाई, SQL इंजेक्शन से बच गए। लेकिन अब जब आप वही डेटा HTML पेज पर दिखाते हैं, तो क्या होगा? अगर आपने htmlspecialchars() का उपयोग नहीं किया, तो XSS अटैक का खतरा बना रहता है।
याद रखें: हर आउटपुट कॉन्टेक्स्ट (HTML, JavaScript, CSS, URL) के लिए अलग एस्केपिंग चाहिए।
\n\nसही तरीका: HTML में आउटपुट करते समय हमेशा htmlspecialchars($data, ENT_QUOTES, 'UTF-8') का उपयोग करें।
<?php\necho "<p>नमस्ते, " . htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . "</p>";\n?>\n\nगलती नंबर 5: सिर्फ फ्रंटएंड वैलिडेशन पर भरोसा करना
\n\nबहुत से डेवलपर्स सोचते हैं कि JavaScript से फ़ॉर्म वैलिडेशन कर लिया, तो बैकएंड पर कुछ करने की ज़रूरत नहीं। यह सबसे बड़ी भूल है। कोई भी हैकर आसानी से POST रिक्वेस्ट को मैन्युअली भेज सकता है और आपके फ्रंटएंड चेक को बायपास कर सकता है।
\n\nसही तरीका: फ्रंटएंड वैलिडेशन सिर्फ यूज़र अनुभव के लिए है। बैकएंड पर हमेशा सभी इनपुट को फिर से वैलिडेट और सैनिटाइज़ करें।
\n\nनिष्कर्ष: सुरक्षित PHP कोड के लिए चेकलिस्ट
\n\n- \n
- SQL इंजेक्शन से बचें: हमेशा प्रिपेयर्ड स्टेटमेंट (PDO या MySQLi) का उपयोग करें। \n
- XSS से बचें: HTML में आउटपुट करते समय
htmlspecialchars()का उपयोग करें। \n - वैलिडेशन पहले: इनपुट को स्वीकार करने से पहले उसका फ़ॉर्मेट जाँचें। \n
- सैनिटाइज़ेशन सिर्फ ज़रूरत पर: बिना सोचे-समझे डेटा न बदलें। \n
- बैकएंड हमेशा सुरक्षित रखें: फ्रंटएंड वैलिडेशन पर कभी भरोसा न करें। \n
याद रखें: सुरक्षा कोई एक बार की प्रक्रिया नहीं है, बल्कि एक आदत है। हर बार जब आप कोड लिखें, सोचें: "क्या मैं इस डेटा पर भरोसा कर सकता हूँ?" अगर जवाब "नहीं" है, तो सही तरीका अपनाएँ।
\n\nक्या आपकी PHP साइट सुरक्षित है? अभी अपने कोड की समीक्षा करें और इन गलतियों को सुधारें!