2009-10-13 7 views
5

ऐतिहासिक रूप से, मैं हमेशा सभी इनपुट ऐसे उपयोगकर्ताओं से प्राप्त है कि डेटाबेस को छू समाप्त होता है के लिएक्या PHP MySQLi बाध्य पैरामीटर के साथ सुरक्षित प्रश्न सुरक्षित हैं?

mysql_real_escape_string() 

का उपयोग किया है।

अब जब मैं पूरी तरह से MySQLi में परिवर्तित हो गया हूं और मैं बाध्य पैरामीटर के साथ तैयार प्रश्नों का उपयोग कर रहा हूं, तो क्या मैंने एसक्यूएल इंजेक्शन हमलों की संभावना को प्रभावी ढंग से समाप्त कर दिया है?

हूँ मैं कह रहा मैं अब

mysql_real_escape_string()? 

की जरूरत है सही कर यह मेरी समझ और मेरा एक परियोजना का आधार है: http://sourceforge.net/projects/mysqldoneright/files/Base/MysqlDoneRight-0.23.tar.gz/download

यह कुछ मैं गलत हालांकि के रूप में प्राप्त करना चाहते हैं नहीं है अब मैंने इसे जारी कर दिया है, यह दूसरों को भी प्रभावित कर सकता है।

सभी उपयोगकर्ता प्रदान किए गए इनपुट अब bind_parms में समाप्त हो जाएंगे।
तैयार चरण में प्रदान किए गए प्रश्न स्थैतिक हैं।

उत्तर

6

यह इतना आसान नहीं है। इसके बजाय आप शाब्दिक मूल्यों केवल के स्थान पर एसक्यूएल भाव में आवेदन चर interpolating के लिए बाध्य पैरामीटर का उपयोग कर सकते हैं:

$sql = "SELECT * FROM MyTable WHERE id = ".$_GET["id"]; // not safe 

$sql = "SELECT * FROM MyTable WHERE id = ?"; // safe 

लेकिन क्या होगा अगर आप एक शाब्दिक मूल्य के अलावा क्वेरी का हिस्सा गतिशील बनाने की जरूरत है?

$sql = "SELECT * FROM MyTable ORDER BY ".$_GET["sortcolumn"]; // not safe 

$sql = "SELECT * FROM MyTable ORDER BY ?"; // doesn't work! 

पैरामीटर हमेशा एक मूल्य है, न कि किसी स्तंभ पहचानकर्ता के रूप में व्याख्या की जाएगी। आप ORDER BY 'score' के साथ एक क्वेरी चला सकते हैं, जो ORDER BY score से अलग है, और पैरामीटर का उपयोग पूर्व के रूप में किया जाएगा - निरंतर स्ट्रिंग 'score', score नामक कॉलम में मान नहीं।

तो ऐसे कई मामले हैं जहां आपको गतिशील एसक्यूएल का उपयोग करना होगा और परिणाम प्राप्त करने के लिए क्वेरी में इंटरफेलेट अनुप्रयोग चर का उपयोग करना होगा। उन मामलों में, क्वेरी पैरामीटर आपकी मदद नहीं कर सकते हैं। एसक्यूएल इंजेक्शन त्रुटियों को रोकने के लिए आपको अभी भी सतर्क और कोड रक्षात्मक होना है।

कोई ढांचा या डेटा-एक्सेस लाइब्रेरी आपके लिए यह काम नहीं कर सकती है। आप हमेशा एक SQL क्वेरी स्ट्रिंग बना सकते हैं जिसमें SQL इंजेक्शन दोष होता है, और डेटा-एक्सेस लाइब्रेरी SQL क्वेरी को देखने से पहले आप ऐसा करते हैं। तो यह जानना कैसा है कि जानबूझकर क्या है और क्या दोष है?

यहाँ तरीकों सुरक्षित एसक्यूएल प्रश्नों प्राप्त करने के लिए कर रहे हैं:

  • फ़िल्टर इनपुट। किसी भी परिवर्तनीय डेटा का पता लगाएं जो आपके SQL प्रश्नों में डाला जाता है। अवैध पात्रों को बाहर निकालने के लिए इनपुट filters का उपयोग करें।उदाहरण के लिए, यदि आप एक पूर्णांक की अपेक्षा करते हैं, तो सुनिश्चित करें कि इनपुट पूर्णांक होने के लिए बाध्य है।

  • आउटपुट आउटपुट। इस संदर्भ में आउटपुट SQL सर्वर हो सकता है जिसे आप डेटाबेस सर्वर पर भेजते हैं। आप जानते हैं कि आप मानों के लिए SQL क्वेरी पैरामीटर का उपयोग कर सकते हैं, लेकिन कॉलम नाम के बारे में क्या? आपको पहचानकर्ताओं के लिए एक भागने/उद्धरण समारोह की आवश्यकता है, जैसे पुराने mysql_real_escape_string() स्ट्रिंग मानों के लिए है।

  • कोड समीक्षा। किसी को आंखों की दूसरी जोड़ी बनने के लिए प्राप्त करें और अपने SQL कोड पर जाएं, ताकि आप उन स्थानों को ढूंढ सकें जहां आपने उपरोक्त दो तकनीकों का उपयोग करने के लिए उपेक्षित किया था।

+0

हाँ। ध्यान दिया गया है कि आप ऑर्डर नहीं कर सके? पैरामीटर के साथ थोड़ा सा। अच्छा उत्तर। –

+0

मुझे एक डाउनवोट मिला? डाउनवॉटर, आपको वर्णन करना चाहिए कि आपको क्यों लगता है कि यह उत्तर संतोषजनक नहीं है। शायद मैं इसे सुधार सकता हूं। –

13

हां। तैयार क्वेरी का उपयोग पैरामीटर से बच जाएगा।

+0

लघु, मीठा और सटीक। – ceejayoz

+0

धन्यवाद। बस यह सुनिश्चित करना चाहता था कि मैं कुछ स्पष्ट नहीं खो रहा था। मैं ऐसा करता हूं। –

1

जब आप एक तैयार कथन में पैरामीटर बाध्य करते हैं, तो यह स्वचालित रूप से डेटा से बच निकलता है, इसलिए इसे भेजने से पहले आपको इससे बचना नहीं चाहिए। डबल एस्केपिंग आमतौर पर एक बुरी चीज है। कम से कम, यह बाद में अतिरिक्त बच निकले पात्रों के साथ बदसूरत परिणाम पैदा करता है।

संबंधित मुद्दे