Free tutorials & notes in Hindi & English · Clean code examples 🧰 मुफ़्त PDF और फ़ोटो टूल्स →
🔴 Advanced  ·  Lesson 36

SQL Injection Prevention

SQL injection क्या है

SQL injection एक attack है जहाँ user किसी input में SQL code घुसाता है — जैसे login box — और, अगर आप अपनी query उस input को चिपकाकर बनाएँ, तो database attacker का code चला देता है। यह निजी data पढ़, records बदल, या पूरी tables तक delete कर सकता है। यह सबसे गंभीर web security जोखिमों में से एक है।

⚠️ इसे रोकने वाला एक नियम: user input चिपकाकर SQL कभी मत बनाइए। Prepared statements इस्तेमाल कीजिए।

Attack कैसे काम करता है

एक login सोचिए जो email को सीधे SQL में चिपकाता है। आम user अपना email डालता है; attacker डालता है:

' OR '1'='1

Query बन जाती है ... WHERE email = '' OR '1'='1', जो हमेशा true है — तो attacker बिना password login कर लेता है। ख़तरा input को SQL का हिस्सा मानने में है।

ख़तरनाक तरीका

<?php
  // ऐसा कभी मत कीजिए:
  $email = $_POST["email"];
  $sql = "SELECT * FROM users WHERE email = '$email'";
  $result = $pdo->query($sql);
?>

यहाँ user का input SQL text का हिस्सा बन जाता है। जो भी SQL वो type करे वो चलता है। यही एक pattern लगभग हर injection attack का कारण है।

सुरक्षित तरीका: prepared statements

<?php
  $email = $_POST["email"];
  $stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?");
  $stmt->execute([$email]);
  $user = $stmt->fetch();
?>
Query safely चलती है, input सिर्फ़ data मानी जाती है

? एक placeholder है। असली value execute() में जाती है, और database उसे सख़्ती से data मानता है — कभी SQL नहीं। ' OR '1'='1 भी अब सिर्फ़ हानिरहित text है।

Named placeholders

PDO लंबी queries के लिए साफ़ named placeholders भी support करता है।

<?php
  $stmt = $pdo->prepare(
      "SELECT * FROM users WHERE email = :email AND status = :status"
  );
  $stmt->execute([":email" => $email, ":status" => "active"]);
?>

:email जैसे named placeholders साफ़ करते हैं कौन-सी value कहाँ जाती है — जब query में कई inputs हों तो सहायक।

अतिरिक्त अच्छी आदतें

  • Least privilege: database user को सिर्फ़ ज़रूरी permissions दीजिए।
  • Input validate कीजिए: फिर भी जाँचिए data सही आकार का हो (valid email, number वग़ैरह)।
  • Production में errors छिपाइए: users को raw SQL errors मत दिखाइए; उन्हें log कीजिए।
  • Output escape कीजिए: data दिखाते समय htmlspecialchars इस्तेमाल कीजिए ताकि XSS भी रुके।

आम गलतियाँ

  • Input को SQL में चिपकाना। मूल कारण — हमेशा placeholders इस्तेमाल कीजिए।
  • SELECT के लिए prepared statements छोड़ना। Search boxes भी classic injection बिंदु हैं।
  • सिर्फ़ escaping पर भरोसा। भूलना आसान है; prepared statements ज़्यादा सुरक्षित।
  • Raw SQL errors दिखाना। वे आपकी structure attackers को बताते हैं।

सारांश

  • SQL injection unsafe input के ज़रिए attacker का SQL चलाता है।
  • कारण है user input को सीधे query में चिपकाना।
  • Prepared statements SQL और values अलग भेजते हैं — भरोसेमंद हल।
  • हर user value के लिए placeholders (? या :name) इस्तेमाल कीजिए, SELECT समेत।
  • अतिरिक्त परतों के रूप में validation, least privilege और छिपे errors जोड़िए।

आगे, इसे लगाइए PHP MySQL connection में, या XSS रोकिए XSS prevention से।

अक्सर पूछे जाने वाले प्रश्न (FAQ)

SQL injection क्या है?
SQL injection एक attack है जहाँ user किसी input field में SQL code type करता है, और अगर आप वो input सीधे query में चिपकाएँ, तो database attacker का code चला देता है। यह आपका data पढ़, बदल या delete कर सकता है। यह सबसे आम और ख़तरनाक web कमज़ोरियों में से एक है।
Prepared statements SQL injection कैसे रोकते हैं?
Prepared statement SQL structure और values अलग-अलग भेजता है। Database values को पूरी तरह data मानता है, कभी commands नहीं। तो user SQL type भी करे, वो plain text की तरह store होता है और चल नहीं सकता।
क्या SQL injection रोकने को input escape करना काफ़ी है?
Escaping मदद करता है पर error-prone है और भूलना आसान। Prepared statements भरोसेमंद, सुझाया गया बचाव है। किसी भी user-supplied value वाली हर query के लिए इन्हें इस्तेमाल कीजिए।
Security के लिए PDO और MySQLi में क्या बेहतर है?
दोनों prepared statements support करते हैं और सही इस्तेमाल पर दोनों सुरक्षित हैं। PDO अक्सर अपने साफ़, एक जैसे API और named placeholders के लिए पसंद किया जाता है, पर मुख्य बात है: जो भी चुनें, हमेशा prepared statements इस्तेमाल कीजिए।
क्या SELECT के लिए भी prepared statements चाहिए?
हाँ। user input वाली कोई भी query — SELECT, INSERT, UPDATE या DELETE — attack हो सकती है। SELECT को feed करता search box classic injection बिंदु है, तो वहाँ भी prepared statement इस्तेमाल कीजिए।
← Back to PHP Tutorial
🔗

Share this topic with a friend

यह topic किसी दोस्त को भेजें

Found it useful? Send it to a classmate learning the same thing.

अच्छा लगा? जो दोस्त यही सीख रहा है, उसे भेज दीजिए।

💻 लाइव कोड एडिटर

इस पेज के प्रोग्राम यहीं तैयार हैं — चलाएँ, बदलें और सीखें। कुछ भी इंस्टॉल किए बिना।
OneCompiler द्वारा संचालित। कोड एडिटर में अपने आप आ जाता है — Run दबाकर आउटपुट देखें। अगर एडिटर न खुले तो नए टैब में खोलें.
अगला topicREST API आपकी प्रगति: 36 / 50 (72%) · Lesson 37 / 50 आगे बढ़ें →

यह lesson कैसा लगा?

आपकी राय से हम content और बेहतर बनाते हैं।

अपना review और सुझाव लिखें (वैकल्पिक)

Review approve होने के बाद आपका नाम और शहर इसके साथ public दिख सकते हैं। Email या phone न लिखें।

▶ CodingEasily on YouTube

Video से सीखें – आसान Hindi में

चुनी हुई video: RDBMS भाग 3 – Class XI Commerce IT

▶ Channel subscribe करें