PHP में SQL इंजेक्शन से बचाव: 2025 के लिए संपूर्ण गाइड

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

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

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

परिचय: SQL इंजेक्शन आज भी क्यों खतरनाक है?

\n\n

कल्पना करें: आपकी वेबसाइट बढ़िया काम कर रही है, यूज़र रजिस्टर कर रहे हैं, कमेंट कर रहे हैं, ऑर्डर दे रहे हैं। और अचानक — डेटाबेस हैकर के कब्ज़े में आ जाता है। ऐसा इसलिए नहीं कि हैकर बहुत जीनियस है, बल्कि इसलिए कि किसी ने SQL क्वेरी में एक प्रश्न चिह्न (?) लगाना भूल गया।

\n\n

SQL इंजेक्शन 2000 के दशक का पुराना खतरा नहीं है। 2024 में भी OWASP इसे वेब एप्लीकेशन की टॉप-3 सबसे खतरनाक कमजोरियों में गिनता है। Stack Overflow पर "How can I prevent SQL injection in PHP?" सवाल के 1.5 मिलियन से ज़्यादा व्यूज़ हैं — और यह संख्या बढ़ती जा रही है। मतलब, समस्या अभी भी जिंदा है।

\n\n

इस आर्टिकल में हम सीखेंगे कि 2025 में PHP में SQL इंजेक्शन का ताबूत में आखिरी कील कैसे ठोकें। बिना जादू, बिना जटिल फ्रेमवर्क, सिर्फ साफ कोड और बेस्ट प्रैक्टिसेज।

\n\n

SQL इंजेक्शन क्या है? सरल भाषा में समझें

\n\n

SQL इंजेक्शन तब होता है जब यूज़र का इनपुट SQL कमांड का हिस्सा बन जाता है, न कि सिर्फ डेटा। एक असल ज़िंदगी का उदाहरण:

\n\n
<?php\n// खराब कोड — ऐसा कभी न करें!\n$username = $_POST['username'];\n$query = "SELECT * FROM users WHERE username = '$username'";\n$result = mysqli_query($conn, $query);\n?>
\n\n

अगर हैकर username फील्ड में ' OR '1'='1 डाल दे, तो क्वेरी बन जाएगी:

\n\n
SELECT * FROM users WHERE username = '' OR '1'='1'
\n\n

यह सभी यूज़र्स को लौटा देगा। और अगर कोई '; DROP TABLE users; -- डाले — तो पूरी टेबल डिलीट हो सकती है। डरावना है, है न?

\n\n

PHP 2025 में SQL इंजेक्शन से बचाव के बेस्ट प्रैक्टिसेज

\n\n

1. PDO का उपयोग Prepared Statements के साथ करें (यही स्टैंडर्ड है)

\n\n

PDO (PHP Data Objects) डेटाबेस के साथ काम करने का एक यूनिवर्सल इंटरफेस है। इसका सबसे बड़ा फायदा: यह SQL लॉजिक और डेटा को अलग करता है। आप प्लेसहोल्डर के साथ क्वेरी लिखते हैं, और PDO खुद सुरक्षित एस्केपिंग का ध्यान रखता है।

\n\n
<?php\n// अच्छा कोड — PDO का उपयोग करें\n$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';\n$pdo = new PDO($dsn, $user, $pass, [\n    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,\n    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,\n    PDO::ATTR_EMULATE_PREPARES => false, // एमुलेशन बंद करें\n]);\n\n$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');\n$stmt->execute(['email' => $_POST['email']]);\n$user = $stmt->fetch();\n?>
\n\n

यह कैसे काम करता है? डेटाबेस को क्वेरी की संरचना और डेटा अलग-अलग मिलता है। भले ही यूज़र खतरनाक SQL डाले, वह सिर्फ एक सामान्य स्ट्रिंग की तरह इंटरप्रेट होगा, कमांड के हिस्से की तरह नहीं।

\n\n

2. Mysqli का उपयोग Prepared Statements के साथ (वैकल्पिक तरीका)

\n\n

अगर आप सिर्फ MySQL के साथ काम करते हैं, तो mysqli का उपयोग कर सकते हैं — लेकिन सिर्फ Prepared Statements के साथ, mysqli_real_escape_string() के साथ नहीं।

\n\n
<?php\n$mysqli = new mysqli('localhost', 'user', 'pass', 'testdb');\n$stmt = $mysqli->prepare('INSERT INTO comments (user_id, text) VALUES (?, ?)');\n$stmt->bind_param('is', $userId, $commentText);\n$stmt->execute();\n?>
\n\n

ध्यान दें: 2025 में भी mysqli_real_escape_string() मौजूद है, लेकिन सुरक्षा के लिए इस पर भरोसा करना गलत है। यह सिर्फ स्ट्रिंग्स को एस्केप करता है, लेकिन न्यूमेरिक फील्ड या LIKE ऑपरेटर में इंजेक्शन से नहीं बचाता।

\n\n

3. फिल्टरेशन और वैलिडेशन — दूसरी सुरक्षा दीवार

\n\n

Prepared Statements बुनियाद हैं। लेकिन इसमें डेटा टाइप के हिसाब से फिल्टरेशन भी जोड़ें। अगर नंबर चाहिए — तो चेक करें कि वह नंबर है। अगर email चाहिए — तो फॉर्मेट चेक करें।

\n\n
<?php\n$id = filter_input(INPUT_POST, 'user_id', FILTER_VALIDATE_INT);\nif ($id === false) {\n    throw new InvalidArgumentException('ID एक इंटीजर होना चाहिए');\n}\n\n$stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id');\n$stmt->execute(['id' => $id]);\n?>
\n\n

इन तकनीकों को मिलाकर आप अपने PHP एप्लीकेशन को SQL इंजेक्शन से पूरी तरह सुरक्षित बना सकते हैं।

ब्लॉग

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