2010-06-23 14 views
6

मैं वर्तमान में mysqli php एक्सटेंशन का उपयोग कर रहा हूं।mysqli तैयार कथन और mysqli_real_escape_string

परंपरागत रूप से मैंने उपयोगकर्ता इनपुट से बचने के लिए mysqli_real_escape_string का उपयोग किया है। हालांकि मैं तैयार बयानों का उपयोग करने के लिए कोड (उम्मीद है कि संभवतः कुछ चरणों में) में बदलना चाहता हूं।

मैं इस पर स्पष्ट होना चाहता हूं - बशर्ते मैं अपने सभी चरों को बांधने के लिए तैयार बयानों का उपयोग करता हूं, क्या मुझे विश्वास हो सकता है कि एसक्यूएल इंजेक्शन असंभव है? (और mysqli_real_escape_string साथ पूरी तरह से बांटना?)

धन्यवाद

उत्तर

5

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

'SELECT * FROM ' . $tablename . ' WHERE id = ?' 

लेकिन अगर आप इस तरह की बातें करने से बचने यह संभावना नहीं आप समस्याओं होगा।

+0

हाँ, अधिक जानकारी के लिए http://www.sjmp.de/php/php-mysql-mehr-sicherheit-und-erhoehte-performance-durch-mysqli-und-prepared-statements/ देखना – Tobias

4

सुरक्षा की बात करते हुए, यदि आप सही ढंग से बाध्य या प्रारूपित करते हैं, तो दोनों विधियों के बीच कोई अंतर नहीं है।

बाइंडिंग बस आसान है, क्योंकि इसका उपयोग किसी भी मामले के लिए किया जा सकता है, जबकि भागने से बच नहीं सकता है (इसलिए, आपको भागने/उद्धरण के बजाय कुछ चर डालना होगा)।

इसके अलावा, ध्यान रखें कि कोई बाध्यकारी और न ही बचने से पहचानकर्ता सुरक्षित हो सकता है। इसलिए, यदि आपको अपनी क्वेरी में फ़ील्ड नाम या ऑपरेटर का उपयोग करना है, तो आपको अपनी स्क्रिप्ट में हार्डकोड किए गए मान का उपयोग करना होगा।

2

यहां विषय पर मेरा उच्च स्तरीय दृश्य है।

गतिशील एसक्यूएल तारों का उपयोग करते समय, आप ठीक से काम कर रहे एस्केपिंग फ़ंक्शन पर निर्भर हैं। दुर्भाग्य से, यह हमेशा मामला है, के रूप में यह (वैसे पुराने) उदाहरण में देखा जा सकता है:

http://dev.mysql.com/doc/refman/5.0/en/news-5-0-22.html

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

यदि आप पैरामीटर के साथ तैयार कथन का उपयोग करते हैं, तो कथन पहले पार्स और संकलित किया जाता है। जब डेटा निष्पादित किया जाता है तो डेटा मान संकलित कथन के साथ संयुक्त होते हैं। यह SQL तर्क को डेटा मानों से अलग करता है - दो को भ्रमित करने का अवसर कभी नहीं होना चाहिए।

तो, हाँ, आप mysqli_real_escape_string के साथ बांट सकते हैं, लेकिन मैं अब तक नहीं कहूंगा कि पैरामीटर के साथ तैयार बयान का उपयोग एसक्यूएल इंजेक्शन असंभव बनाता है। यह इसे काफी कठिन बनाता है, लेकिन mysqli_real_escape_string बग के साथ, मुझे लगता है कि अभी तक ऐसा मौका है कि अभी तक खोजा जा सकता है (या नव निर्मित) बग असंभव, असंभव बना देगा।