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 जोखिमों में से एक है।
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();
?>
? एक 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 से।
