Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

PHP / MySQLi:INSERT पर SQL इंजेक्शन को कैसे रोकें (कोड आंशिक रूप से काम कर रहा है)

नए 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 का उपयोग करें विधि कॉल तब होती है जब आप बिना किसी इनपुट पैरामीटर के पूरी क्वेरी स्वयं लिखते हैं, और विशेष रूप से उपयोगकर्ता द्वारा पारित कोई इनपुट पैरामीटर नहीं!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. यदि मौजूद है तो मैं कैसे अपडेट करूं, यदि नहीं तो सम्मिलित करें (AKA upsert या merge) MySQL में?

  2. MySQL परिणाम को बैश में संसाधित करना

  3. टेक्स्ट क्षेत्र में दर्ज किया गया डेटा PHP और mysqli का उपयोग करके डिज़ाइन किए गए डेटाबेस में प्रवेश नहीं करेगा

  4. दो डेटाबेस से कनेक्ट करें

  5. MYSQL स्थापना समस्याएँ