mysql_real_escape_string फ़ंक्शन की कई गंभीर कमियां हैं, विशेषकर आधुनिक विकास में:
मुख्य कमियां
- प्रीपेयर्ड स्टेटमेंट के साथ असंगत: यह फ़ंक्शन प्रीपेयर्ड स्टेटमेंट (parameterized queries) के साथ काम नहीं करता, जो SQL इंजेक्शन रोकने का स्वर्ण मानक है।
- टाइप-सेफ नहीं: यह सभी डेटा को स्ट्रिंग मानता है, पूर्णांक, दिनांक आदि के लिए उपयुक्त नहीं।
- इंजेक्शन हमलों के विरुद्ध अपूर्ण सुरक्षा: कुछ एन्कोडिंग/कैरेक्टर सेट स्थितियों में बायपास संभव।
- डिप्रिकेटेड: PHP 5.5.0 में डिप्रिकेटेड, PHP 7.0.0 में हटा दिया गया।
- कनेक्शन-निर्भर: सक्रिय MySQL कनेक्शन की आवश्यकता होती है।
समस्याग्रस्त कोड उदाहरण
(int)mysql_real_escape_string($_REQUEST['id']);
// टाइपकास्टिंग के बावजूद, यह हर हमले के लिए सुरक्षित नहीं
आधुनिक विकल्प: प्रीपेयर्ड स्टेटमेंट
// PDO उदाहरण
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([$id]);
$row = $stmt->fetch();
// MySQLi उदाहरण
$stmt = $mysqli->prepare('SELECT * FROM users WHERE id = ?');
$stmt->bind_param('i', $id);
$stmt->execute();
निष्कर्ष
कभी भी mysql_real_escape_string का उपयोग न करें। हमेशा PDO या MySQLi के साथ प्रीपेयर्ड स्टेटमेंट उपयोग करें। यह सुरक्षित, तेज़ और रखरखाव योग्य है।