PHP में PDO क्वेरीज़ की समस्याएं
जैसा कि आपको पहले से ही पता होना चाहिए, SQL क्वेरीज़ SQL-इंजेक्शन के लिए असुरक्षित होती हैं। PDO एक्सटेंशन इंजेक्शन से लड़ने के लिए बनाया गया है, लेकिन डिफ़ॉल्ट रूप से, यह स्वचालित रूप से ऐसा नहीं करता है।
आइए एक उदाहरण के साथ समस्या को देखें। मान लीजिए कि हमारे पास निम्नलिखित क्वेरी है, जिसमें एक वेरिएबल डाला गया है:
<?php
$sql = "SELECT * FROM users WHERE id=$id";
$res = $pdo->query($sql);
?>
मान लीजिए कि हमारा वेरिएबल बाहर से आता है, उदाहरण के लिए, GET पैरामीटर से। सरलता के लिए, हालांकि, आइए बस इसका मान मैन्युअल रूप से सेट करें। हम एक संख्यात्मक मान की अपेक्षा करते हैं, उदाहरण के लिए, इस तरह:
<?php
$id = 1;
?>
हालांकि, एक दुर्भावनापूर्ण हैकर निम्नलिखित
मान पास कर सकता है (मान लें कि हमारे पास
एक फ़ील्ड role है):
<?php
$id = '-1 OR role="admin"';
?>
ऐसा होता है कि हम निम्नलिखित क्वेरी चाहते थे:
<?php
$sql = "SELECT * FROM users WHERE id=1";
$res = $pdo->query($sql);
?>
लेकिन हमें निम्नलिखित क्वेरी मिली, जो वेबसाइट के एडमिनिस्ट्रेटर को बाहर निकालती है:
<?php
$sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
$res = $pdo->query($sql);
?>
इस स्थिति से बचने के लिए, PDO में एक विशेष तंत्र प्रदान किया गया है, जिसे प्रिपेयर्ड स्टेटमेंट्स कहा जाता है। इन पर हम अगले पाठ में चर्चा करेंगे।
जानबूझकर अपने डेटाबेस पर SQL-इंजेक्शन कार्यान्वित करें।