नए PHP कोड . में स्निपेट, आप अभी भी इंजेक्शन के लिए असुरक्षित हैं।
आप सम्मिलित भाग में एक तैयार कथन का उपयोग कर रहे हैं, लेकिन आप वास्तव में तैयारी की ताकत का सही ढंग से उपयोग नहीं कर रहे हैं।
तैयार कथन बनाते समय, आप एक क्वेरी बनाते हैं जिसमें आप कच्चे मानों के बजाय प्लेसहोल्डर जोड़ते हैं:
$stmt = $conn->prepare("INSERT INTO Users (email, pw) VALUES (?, ?)");
प्रश्न चिह्न प्लेसहोल्डर हैं और बाद में bind_param
. का उपयोग करके प्रतिस्थापित किए जाते हैं विधि:
$stmt->bind_param('ss', $email, $pw);
ss
बाइंड कॉल का हिस्सा mysql db को बताता है कि इसके दो तार जो डेटाबेस को पास किए गए हैं (s string
. के लिए , मैं int
. के लिए आदि)।
आप एक परम ($name
. को बाध्य कर रहे हैं ) लेकिन इसका न तो कोई प्लेसहोल्डर है और न ही क्वेरी में किसी प्रकार का संदर्भ..?
दूसरी ओर आपका चयन कथन अभी भी असुरक्षित है और कमजोरियों के लिए खुला है।
मैं शायद वहां एक तैयार कथन का उपयोग करूंगा, जैसे कि सम्मिलित भाग के साथ।
आप हमेशा यह सुनिश्चित करना चाहते हैं कि उपयोगकर्ता से इनपुट डेटाबेस के लिए "सुरक्षित" है, यदि आप एक क्वेरी स्ट्रिंग को जोड़ते हैं और इसमें उपयोगकर्ता इनपुट जोड़ते हैं, तो डेटाबेस स्ट्रिंग से बच नहीं पाएगा, यह बस इसे चलाएगा।
केवल मानक query
का उपयोग करें विधि कॉल तब होती है जब आप बिना किसी इनपुट पैरामीटर के पूरी क्वेरी स्वयं लिखते हैं, और विशेष रूप से उपयोगकर्ता द्वारा पारित कोई इनपुट पैरामीटर नहीं!