PHP 2025 में SQL-इंजेक्शन: कैसे बचें? पूर्ण गाइड

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

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

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

परिचय: 2025 में SQL-इंजेक्शन अभी भी प्रासंगिक क्यों है?

\n\n

कल्पना करें: आपने PHP में एक शानदार वेबसाइट बनाई, एक संपर्क फ़ॉर्म और उत्पाद खोज जोड़ा, और एक सप्ताह बाद पता चलता है कि एक हमलावर ने पूरे ग्राहक डेटाबेस को डाउनलोड कर लिया। क्या यह 2010 के दशक की डरावनी कहानी जैसा लगता है? दुर्भाग्य से, OWASP के अनुसार, SQL-इंजेक्शन (SQL injection) अभी भी वेब एप्लिकेशन की शीर्ष 3 सबसे खतरनाक कमज़ोरियों में शामिल है। और हाँ, 2025 में भी डेवलपर्स यह गलती कर रहे हैं।

\n\n

Stack Overflow पर प्रश्न "How can I prevent SQL injection in PHP?" ने हज़ारों व्यूज़ और सैकड़ों उत्तर प्राप्त किए हैं। लेकिन समस्या जानकारी की कमी नहीं है — समस्या यह है कि कई लोग अभी भी mysql_* फ़ंक्शन (जिन्हें PHP 7.0 में हटा दिया गया था) जैसी पुरानी विधियों का उपयोग कर रहे हैं या mysqli_real_escape_string() को एक चांदी की गोली मानकर भोलेपन से उस पर निर्भर हैं।

\n\n

इस लेख में, हम 2025 में PHP में SQL-इंजेक्शन से बचाव के सर्वोत्तम तरीकों पर चर्चा करेंगे। आप जानेंगे कि तैयार क्वेरी (prepared statements) उद्योग का मानक क्यों हैं, PDO और mysqli के साथ सही तरीके से कैसे काम करें, और कौन सी गलतियाँ अभी भी अनुभवहीन डेवलपर्स का इंतज़ार कर रही हैं। चलिए शुरू करते हैं!

\n\n

सरल शब्दों में SQL-इंजेक्शन क्या है?

\n\n

SQL-इंजेक्शन एक हमला है जिसमें हमलावर उपयोगकर्ता इनपुट (फ़ॉर्म, URL, कुकीज़) के माध्यम से क्वेरी में दुर्भावनापूर्ण SQL कोड "इंजेक्ट" करता है। सिर्फ़ उपयोगकर्ता नाम देने के बजाय, हैकर भेज सकता है: ' OR '1'='1 — और सभी डेटा तक पहुँच प्राप्त कर सकता है।

\n\n

यहाँ कमज़ोर कोड का एक क्लासिक उदाहरण है:

\n\n
// ऐसा कभी न करें!\n$username = $_POST['username'];\n$password = $_POST['password'];\n$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";\n$result = mysqli_query($conn, $query);\n
\n\n

यदि हमलावर username फ़ील्ड में admin' -- दर्ज करता है, तो क्वेरी बन जाती है:

\n\n
SELECT * FROM users WHERE username = 'admin' --' AND password = '...'\n
\n\n

-- के बाद सब कुछ एक टिप्पणी है। प्रमाणीकरण पारित हो गया। डेटाबेस हमारा है। नमस्ते, डेटा लीक!

\n\n

विधि #1 (और सबसे महत्वपूर्ण): तैयार क्वेरी (Prepared Statements)

\n\n

2025 में, SQL-इंजेक्शन से बचाव का यह एकमात्र अनुशंसित तरीका है। तैयार क्वेरी SQL तर्क को डेटा से अलग करती हैं। आप पहले डेटाबेस को बताते हैं: "यहाँ क्वेरी का टेम्पलेट है, यहाँ वेरिएबल के लिए स्थान हैं", और फिर डेटा अलग से भेजते हैं। डेटाबेस स्वयं आवश्यकतानुसार सब कुछ एस्केप करता है।

\n\n

विकल्प A: PDO (PHP Data Objects) — आधुनिक मानक

\n\n

PDO 12 विभिन्न DBMS (MySQL, PostgreSQL, SQLite और अन्य) का समर्थन करता है। यदि आप 2025 में एक नया प्रोजेक्ट लिख रहे हैं — तो PDO का उपयोग करें।

\n\n
<?php\n// PDO के माध्यम से DB से कनेक्शन\n$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';\n$user = 'root';\n$password = '';\n\ntry {\n    $pdo = new PDO($dsn, $user, $password);\n    // महत्वपूर्ण: त्रुटियों पर अपवाद फेंकना\n    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);\n} catch (PDOException $e) {\n    die('कनेक्शन त्रुटि: ' . $e->getMessage());\n}\n\n// नामित प्लेसहोल्डर के साथ तैयार क्वेरी\n$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email AND status = :status');\n$stmt->execute([\n    ':email' => $_POST['email'],\n    ':status' => 'active'\n]);\n$user = $stmt->fetch(PDO::FETCH_ASSOC);\n\n// स्थितीय प्लेसहोल्डर (?) के साथ विकल्प\n$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ? AND status = ?');\n$stmt->execute([$_POST['email'], 'active']);\n$user = $stmt->fetch();\n?>\n
\n\n

यह सुरक्षित क्यों है? क्योंकि डेटा कभी भी सीधे SQL स्ट्रिंग में नहीं डाला जाता है। भले ही उपयोगकर्ता ' OR '1'='1 भेजे, PDO इसे एक स्ट्रिंग लिटरल के रूप में भेजेगा, और डेटाबेस इसे SQL कमांड के भाग के रूप में नहीं, बल्कि एक स्ट्रिंग के रूप में समझेगा।

\n\n

विकल्प B: MySQLi (MySQL Imp

ब्लॉग

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