खराब उत्तर:
भरोसेमंद नहीं। आप mysql_escape_string()
का जिक्र कर रहे हैं , जो कनेक्शन एन्कोडिंग को ध्यान में नहीं रखता है (जबकि mysql_real_escape_string()
करता है)।
तो हो सकता है कि सावधानीपूर्वक तैयार की गई स्ट्रिंग, ध्यान से तैयार किए गए अपूर्ण UTF8 कोडपॉइंट के सामने, हो सकता है परिणाम, मान लीजिए, एक उद्धरण चिह्न mysql_escape_string()
. द्वारा बच निकला जा रहा है लेकिन एस्केप को MySQL द्वारा अनदेखा किया जा रहा है चूंकि यह इसे UTF8 वर्ण के रूप में "देखेगा"।
उदा.:
0xC2' OR 1=1 ;--
mysql_escape_string()
से बच जाएगा के रूप में
0xC2\' OR 1=1 ;--
जिसे इकट्ठा किया जाएगा
WHERE password='0xC2\' OR 1=1 ;--';
और MySQL द्वारा देखा गया (यदि उचित कनेक्शन एन्कोडिंग प्रभाव में था), जैसे, कहें,
WHERE password='€' OR 1=1 ;[--';] <-- the bracketed part is considered a comment and ignored
जो एक क्लासिक SQL इंजेक्शन होगा।
लेकिन यह इस तथ्य पर चलता है कि आपने निर्दिष्ट किया, शायद व्याकुलता के माध्यम से, एक दोगुना बहिष्कृत फ़ंक्शन . अगर आप वाकई mysql_real_escape_string()
. की बात कर रहे थे , तो यह काम नहीं करेगा।
साथ ही, यह मानता है कि इनपुट को पॉप्युलेट करते समय न तो सर्वर, न ही एप्लिकेशन लेयर (जैसे PHP) किसी भी प्रकार के वर्णसेट सत्यापन को नियोजित करता है। यदि उन्होंने किया, तो अमान्य UTF8 आगमन पर हटा दिया जाएगा, और कभी भी mysql_escape_string
द्वारा देखा भी नहीं जाएगा। , जो निश्चित रूप से पर्याप्त होगा।
असली जवाब:
mysql_escape_string
का उपयोग न करें (या mysql_whatever
) बिल्कुल भी। उन्हें बहिष्कृत कर दिया गया है और आपका कोड काम करना बंद कर सकता है। इसके बजाय पीडीओ फ़ंक्शन का उपयोग करें।