स्ट्रिंग से बचने का क्या मतलब है?


84

मैं पढ़ रहा था क्या $ _SESSION ['उपयोगकर्ता नाम'] SQL क्वेरी में आने से पहले बच जाना चाहिए? और इसने कहा कि "आपको अपने मूल की परवाह किए बिना, sql क्वेरी में पास होने वाले हर स्ट्रिंग से बचने की आवश्यकता है"। अब मुझे पता है कि यह वास्तव में बुनियादी है। Google खोज 20, 000 परिणामों से अधिक हो गई। अकेले Stackoverflow के परिणामों के 20 पृष्ठ थे, लेकिन कोई भी वास्तव में नहीं बताता है कि एक स्ट्रिंग से बचना क्या है या यह कैसे करना है। यह सिर्फ मान लिया गया है। क्या आप मेरी मदद कर सकते हैं? मैं सीखना चाहता हूं क्योंकि हमेशा की तरह मैं PHP में एक वेब ऐप बना रहा हूं।

: मैं पर ध्यान दिया है डालने एस्केप वर्ण , सभी जावा में भागने पात्रों क्या हैं? , खिचड़ी नशीली दवाओं के साथ एक स्ट्रिंग से बच () , एस्केप चरित्र , mysql_real_escape_string () वास्तव में क्या करता है? , मैं php में एक स्ट्रिंग से दोहरे उद्धरणों से कैसे बच सकता हूँ? , MySQL_real_escape_string स्लैश नहीं जोड़ रहे हैं? , स्ट्रिंग से बचने के दृश्यों को php में हटा सकता हूं, लेकिन मुझे यकीन है कि आपको बिंदु मिल जाएगा। यह आलस्य नहीं है।


10
पीएस मैं सिर्फ एक दोस्त से पूछ सकता था और खुद को बेवकूफ नहीं बना सकता था लेकिन मुझे लगा कि मेरे जैसे ही बहुत सारे लोग होंगे जो इस बात को सोच रहे होंगे कि हर कोई किसके बारे में बात कर रहा है।
ब्रेट करें

जवाबों:


136

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

"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 के संदर्भ में।


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

22

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

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


1

सादगी के लिए, आप मूल रूप से बैकस्लैश "\" की कल्पना कर सकते हैं जो रनटाइम के दौरान दुभाषिया के लिए एक कमांड हो।

इस कथन की व्याख्या करते हुए उदाहरण के लिए:

$txt = "Hello world!";

शाब्दिक विश्लेषण चरण के दौरान (या जब व्यक्ति टोकन में बयान अप बंटवारे) इन टोकन पहचान की जाएगी $, txt, =, ", Hello world!, ", और;

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

$txt = "this \" is escaped";

निम्नलिखित टोकन में परिणाम: $, txt, =, ", this, \, ", is escaped, ", और;

दुभाषिया पहले से जानता है (या पूर्व निर्धारित मार्ग हैं जो इसे ले सकते हैं) उस चरित्र के आधार पर क्या करना है जो \टोकन को सफल करता है । तो इस मामले में "यह एक चरित्र के रूप में व्यवहार करने के लिए आगे बढ़ता है, न कि अंत के स्ट्रिंग कमांड के रूप में।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.