क्या कोई मुझे बता सकता है कि क्या यह सुरक्षित है या यदि यह SQL इंजेक्शन हमले या अन्य SQL हमलों के लिए असुरक्षित है?
नहीं. जैसा कि uri2x कहता है, देखें एसक्यूएल इंजेक्शन जो लगभग mysql_real_escape_string()
मिलता है।
।
सबसे अच्छा तरीका SQL इंजेक्शन को रोकने के लिए तैयार कथनों का उपयोग करना है। वे डेटा (आपके पैरामीटर) को निर्देशों (SQL क्वेरी स्ट्रिंग) से अलग करते हैं और आपकी क्वेरी की संरचना को दूषित करने के लिए डेटा के लिए कोई जगह नहीं छोड़ते हैं। तैयार किए गए कथन एप्लिकेशन सुरक्षा की मूलभूत समस्याओं में से एक का समाधान करते हैं ।
ऐसी स्थिति के लिए जहां आप तैयार किए गए कथनों का उपयोग नहीं कर सकते (उदा. LIMIT
), प्रत्येक विशिष्ट उद्देश्य के लिए बहुत सख्त श्वेतसूची का उपयोग करना गारंटी . का एकमात्र तरीका है सुरक्षा।
// This is a string literal whitelist
switch ($sortby) {
case 'column_b':
case 'col_c':
// If it literally matches here, it's safe to use
break;
default:
$sortby = 'rowid';
}
// Only numeric characters will pass through this part of the code thanks to type casting
$start = (int) $start;
$howmany = (int) $howmany;
if ($start < 0) {
$start = 0;
}
if ($howmany < 1) {
$howmany = 1;
}
// The actual query execution
$stmt = $db->prepare(
"SELECT * FROM table WHERE col = ? ORDER BY {$sortby} ASC LIMIT {$start}, {$howmany}"
);
$stmt->execute(['value']);
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
मेरा मानना है कि अस्पष्ट किनारे के मामलों में भी उपरोक्त कोड SQL इंजेक्शन के लिए प्रतिरक्षा है। यदि आप MySQL का उपयोग कर रहे हैं, तो सुनिश्चित करें कि आपने एमुलेटेड तैयारी को बंद कर दिया है।
$db->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);