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

PDO और तैयार किए गए कथनों के साथ mysql_* फ़ंक्शन को बदलना

दिलचस्प सवाल के लिए धन्यवाद। ये रहा:

<ब्लॉकक्वॉट>

यह खतरनाक पात्रों से बच निकलता है,

आपकी अवधारणा पूरी तरह से गलत है।
वास्तव में "खतरनाक पात्र" एक मिथक है, कोई भी नहीं है। और mysql_real_escape_string से बच रहा है लेकिन केवल एक स्ट्रिंग डिलीमीटर . इस परिभाषा से आप इसकी सीमाओं का निष्कर्ष निकाल सकते हैं - यह केवल स्ट्रिंग्स . के लिए काम करता है ।

<ब्लॉकक्वॉट>

हालांकि, यह अभी भी अन्य हमलों के प्रति संवेदनशील है जिसमें सुरक्षित वर्ण हो सकते हैं लेकिन डेटा प्रदर्शित करने या कुछ मामलों में दुर्भावनापूर्ण रूप से डेटा को संशोधित करने या हटाने के लिए हानिकारक हो सकता है।

आप यहां सब कुछ मिला रहे हैं।
डेटाबेस की बात करें तो,

  • स्ट्रिंग्स के लिए यह असुरक्षित नहीं है। जब तक आपके तार उद्धृत किए जा रहे हैं और बच निकले हैं, वे नहीं "दुर्भावनापूर्ण तरीके से डेटा संशोधित करें या हटाएं"।*
  • अन्य डेटा टाइपडेटा के लिए - हाँ, यह बेकार है . लेकिन इसलिए नहीं कि यह कुछ हद तक "असुरक्षित" है, बल्कि अनुचित उपयोग के कारण है।

डेटा प्रदर्शित करने के लिए, मुझे लगता है कि यह ऑफटॉपिक . है पीडीओ संबंधित प्रश्न में, क्योंकि पीडीओ का डेटा प्रदर्शित करने से कोई लेना-देना नहीं है।

<ब्लॉकक्वॉट>

उपयोगकर्ता इनपुट से बचना

^^^ ध्यान देने योग्य एक और भ्रम!

  • उपयोगकर्ता इनपुट का बचने से कोई लेना-देना नहीं है . जैसा कि आप पूर्व परिभाषा से सीख सकते हैं, आपको स्ट्रिंग्स से बचना होगा, न कि "उपयोगकर्ता इनपुट"। तो, फिर से:

    • आपके पास भागने के तार हैं, चाहे उनके स्रोत कुछ भी हों
    • स्रोत की परवाह किए बिना अन्य प्रकार के डेटा से बचना बेकार है।

बात समझी?
अब, मुझे आशा है कि आप बचने की सीमाओं के साथ-साथ "खतरनाक पात्रों" की गलत धारणा को भी समझ गए होंगे।

<ब्लॉकक्वॉट>

यह मेरी समझ में है कि पीडीओ/तैयार बयानों का उपयोग करना अधिक सुरक्षित है

वास्तव में नहीं।
वास्तव में, चार . हैं विभिन्न क्वेरी भाग जिन्हें हम इसमें गतिशील रूप से जोड़ सकते हैं:

  • एक स्ट्रिंग
  • एक नंबर
  • एक पहचानकर्ता
  • सिंटैक्स कीवर्ड।

इसलिए, आप देख सकते हैं कि भागने में केवल एक ही समस्या शामिल है। (लेकिन निश्चित रूप से, यदि आप संख्याओं को स्ट्रिंग्स के रूप में देखते हैं (उन्हें उद्धरणों में रखते हुए), जब लागू हो , आप उन्हें सुरक्षित भी बना सकते हैं)

जबकि तैयार किए गए बयान कवर करते हैं - उह - पूरे 2 मुद्दे! एक बड़ी बात;-)

अन्य 2 मुद्दों के लिए मेरा पिछला उत्तर देखें, PHP में डेटाबेस में स्ट्रिंग्स सबमिट करते समय क्या मुझे htmlspecialchars() का उपयोग करके अवैध वर्णों का ध्यान रखना चाहिए या रेगुलर एक्सप्रेशन का उपयोग करना चाहिए?

<ब्लॉकक्वॉट>

अब, फ़ंक्शन नाम अलग हैं, इसलिए अब मेरा mysql_query, mysql_fetch_array, mysql_num_rows आदि काम नहीं करेगा।

यह एक और है, PHP का गंभीर भ्रम उपयोगकर्ता , एक प्राकृतिक आपदा, एक आपदा:

पुराने mysql ड्राइवर का उपयोग करते समय भी, किसी को कभी भी नंगे API फ़ंक्शंस का उपयोग नहीं करना चाहिए उनके कोड में! रोजमर्रा के उपयोग के लिए उन्हें किसी पुस्तकालय समारोह में रखना होगा! (कुछ जादुई संस्कार के रूप में नहीं, बल्कि कोड को छोटा, कम दोहराव, त्रुटि-सबूत, अधिक सुसंगत और पठनीय बनाने के लिए)।

पीडीओ के लिए भी यही बात है!

अब फिर से अपने प्रश्न के साथ।

<ब्लॉकक्वॉट>

लेकिन उनका उपयोग करने से क्या यह mysql_real_escape_string जैसी किसी चीज़ का उपयोग करने की आवश्यकता को समाप्त कर देता है?

हाँ।

<ब्लॉकक्वॉट>

लेकिन मुझे लगता है कि यह मोटे तौर पर इस बात का विचार है कि किसी उपयोगकर्ता को डेटाबेस से लाने के लिए क्या किया जाना चाहिए

लाने के लिए नहीं, बल्कि क्वेरी में कोई भी डेटा जोड़ने के लिए !

<ब्लॉकक्वॉट>

अगर मैं गलत नहीं हूं तो आपको PDO:PARAM_STR के बाद एक लंबाई देनी होगी

आप कर सकते हैं, लेकिन आपको इसकी आवश्यकता नहीं है।

<ब्लॉकक्वॉट>

अब, क्या यह सब सुरक्षित है?

डेटाबेस सुरक्षा के संदर्भ में इस कोड में कोई कमजोर स्थान नहीं है। यहां सुरक्षित करने के लिए कुछ भी नहीं है।

सुरक्षा प्रदर्शित करने के लिए - बस इस साइट को XSS . के लिए खोजें कीवर्ड।

आशा है कि मैं इस मामले पर कुछ प्रकाश डालूंगा।

BTW, लंबे इन्सर्ट के लिए आप किसी दिन मेरे द्वारा लिखे गए फ़ंक्शन का कुछ उपयोग कर सकते हैं, पीडीओ का उपयोग करके सहायक फ़ंक्शन डालें/अपडेट करें

हालांकि, मैं इस समय तैयार किए गए बयानों का उपयोग नहीं कर रहा हूं, क्योंकि मैं एक पुस्तकालय का उपयोग करते हुए अपने घर में बने प्लेसहोल्डर्स को पसंद करता हूं। मैंने ऊपर उल्लेख किया है। तो, नीचे दिए गए रीहा द्वारा पोस्ट किए गए कोड का मुकाबला करने के लिए, यह इन 2 पंक्तियों जितना छोटा होगा:

$sql  = 'SELECT * FROM `users` WHERE `name`=?s AND `type`=?s AND `active`=?i';
$data = $db->getRow($sql,$_GET['name'],'admin',1);

लेकिन निश्चित रूप से आपके पास तैयार कथनों का उपयोग करके भी वही कोड हो सकता है।

* (yes I am aware of the Schiflett's scaring tales)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL में दशमलव विभाजक बदलें

  2. हिब्रू वर्णों के बजाय MySQL डीबी प्रश्न चिह्न ..?

  3. हेक्साडेसिमल को वर्कर (डेटाटाइम) में कैसे डाला जाए?

  4. त्रुटि:तालिका xxx के लिए तालिका स्थान मौजूद है। कृपया आयात करने से पहले टेबल स्पेस को त्यागें

  5. MySQL तालिका और स्तंभ अनुमतियाँ प्रदान करें