2012-05-18 16 views
52

मैं Does $_SESSION['username'] need to be escaped before getting into an SQL query? पढ़ रहा था और यह कहा गया था कि "आप अपनी मूल के बावजूद, एसक्यूएल क्वेरी में जाने वाली हर स्ट्रिंग से बचने की जरूरत है"। अब मुझे कुछ पता है जैसे यह वास्तव में बुनियादी है। एक Google खोज 20, 000 परिणाम से अधिक हो गई। स्टैक ओवरफ्लो के पास परिणामों के 20 पृष्ठ थे लेकिन वास्तव में कोई भी बताता है कि स्ट्रिंग से बचने या यह कैसे करना है। यह अभी माना जाता है। क्या आप मेरी मदद कर सकते हैं? मैं सीखना चाहता हूं क्योंकि हमेशा के रूप में मैं PHP में एक वेब ऐप बना रहा हूँ।स्ट्रिंग से बचने का क्या अर्थ है?

मैं पर ध्यान दिया है: Inserting Escape Characters, What are all the escape characters in Java?, Cant escape a string with addcslashes(), Escape character, what does mysql_real_escape_string() really do?, How can i escape double quotes from a string in php?, MySQL_real_escape_string not adding slashes?, remove escape sequences from string in php मैं पर जा सकते हैं, लेकिन मुझे यकीन है कि आप बात समझ रहा हूँ। यह आलस्य नहीं है।

+4

पी एस मैं हो सकता था सिर्फ एक दोस्त से पूछा और खुद को मूर्ख नहीं बनाया लेकिन मैंने सोचा कि मेरे जैसे बहुत सारे लोग सोचेंगे कि यह सब कुछ किस बारे में बात कर रहा है। – Brett

उत्तर

95

स्ट्रिंग से बचने का अर्थ है उस स्ट्रिंग में प्रयुक्त उद्धरण (और अन्य वर्ण) में अस्पष्टता को कम करना। उदाहरण के लिए, जब आप एक स्ट्रिंग तय कर रहे हैं, आप आमतौर पर यह या तो दोहरे उद्धरण चिह्नों या एकल उद्धरण में चारों ओर:

"Hello World." 

लेकिन क्या होगा अगर मेरी स्ट्रिंग के भीतर दोहरे उद्धरण चिह्नों था?

"Hello "World."" 

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

'Hello "World."' 

या मैं अपने उद्धरण बच सकते हैं:

"Hello \"World.\"" 

किसी भी बोली कि एक स्लेश है भाग निकले, और से पहले किया गया है समझ में आ का हिस्सा बनने का स्ट्रिंग का मूल्य।

जब प्रश्नों की बात आती है, तो MySQL में कुछ निश्चित कीवर्ड हैं जो इसके लिए देखता है कि हम कुछ भ्रम पैदा किए बिना हमारे प्रश्नों में उपयोग नहीं कर सकते हैं। मान लीजिए कि हमारे मूल्यों जहां एक कॉलम "चुनें" नामित किया गया था की एक तालिका था, और हम चाहते हैं कि चयन करने के लिए चाहता था:

SELECT select FROM myTable 

अब हमने अपनी क्वेरी में कुछ अस्पष्टता पेश किया है। अपनी क्वेरी के भीतर, हम वापस टिक का उपयोग करके कि अस्पष्टता को कम कर सकते हैं:

SELECT `select` FROM myTable 

यह भ्रम हम फ़ील्ड नामों के चयन में खराब निर्णय का उपयोग करके शुरू की है निकालता है।

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

// Query 
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'", 
      mysql_real_escape_string($user), 
      mysql_real_escape_string($password)); 

अन्य तरीकों से बचने के तार के लिए मौजूद हैं, इस तरह के add_slashes के रूप में, addcslashes, quotemeta और भी बहुत कुछ है, हालांकि आपको लगता है कि मिल जाएगा जब लक्ष्य, एक सुरक्षित क्वेरी चलाने के लिए है द्वारा और बड़े डेवलपर्स (mysql_real_escape_string या pg_escape_string पसंद करते हैं PostgreSQL के संदर्भ में।

+0

आपने कहा है कि 'mysql_real_escape_string()' के माध्यम से बस अपने मूल्यों को पारित करके आप में से बहुत कुछ संभाला जा सकता है, क्या आप हमें यह बताने के लिए अपना जवाब बढ़ा सकते हैं कि एक बड़ा सवाल क्या नहीं हो सकता है या नहीं? – Brett

+0

@ ब्रेट कोई समस्या नहीं है, मैंने जवाब के अंत में थोड़ा और जोड़ा है। – Sampson

+0

धन्यवाद @ जोनाथन ने बहुत सराहना की। – Brett

15

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

mysql_real_escape_string() के मामले में यह निकल जाता \x00, \n, \r, \, ', " और \x1a इन के रूप में, जब से छोड़ा नहीं गया, जैसा कि पहले उल्लेख समस्याओं जो MySQL डेटाबेस के साथ एसक्यूएल इंजेक्शन भी शामिल हो सकता है।

+0

@ धन्यवाद जॉन यह एक अच्छा स्टार्टर जवाब था। मैं वास्तव में खुश हूं कि किसी ने इसे भी चुना क्योंकि यह भी एक वैध जवाब था। – Brett

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