अन्य उत्तर पहले से ही कवर करते हैं जो आपको जानना आवश्यक है। लेकिन शायद यह कुछ और स्पष्ट करने में मदद करता है:
कर रहे हैं दो बातें आपको बस इतना करना:
1. फॉर्म डेटा को मान्य करें।
जैसा कि जोनाथन होब्स का जवाब बहुत स्पष्ट रूप से दिखाता है, फार्म इनपुट के लिए html तत्व की पसंद आपके लिए कोई विश्वसनीय फ़िल्टरिंग नहीं करती है।
सत्यापन आमतौर पर एक तरह से किया जाता है जो डेटा को परिवर्तित नहीं करता है, लेकिन यह फिर से फ़ॉर्म दिखाता है, "कृपया सही" "" के रूप में चिह्नित फ़ील्ड के साथ।
अधिकांश चौखटे और सीएमएस में बिल्डरों की मदद होती है जो इस कार्य में आपकी मदद करते हैं। और सिर्फ इतना ही नहीं, वे CSRF (या "XSRF") के खिलाफ भी मदद करते हैं, जो हमले का दूसरा रूप है।
2. SQL स्टेटमेंट्स में सेनिटाइज / एस्केप वेरिएबल ।।
.. या तैयार कथनों को आप के लिए काम करते हैं।
यदि आप किसी भी चर, उपयोगकर्ता द्वारा प्रदत्त या नहीं के साथ (My) SQL स्टेटमेंट बनाते हैं, तो आपको इन चरों से बचने और उद्धृत करने की आवश्यकता है।
आमतौर पर, MySQL स्टेटमेंट में आपके द्वारा डाला गया कोई भी वैरिएबल या तो एक स्ट्रिंग होना चाहिए, या ऐसा कुछ जिसे PHP मज़बूती से एक स्ट्रिंग में बदल सकता है जिसे MySQL डाइजेस्ट कर सकता है। जैसे, संख्या।
स्ट्रिंग्स के लिए, आपको स्ट्रिंग से बचने के लिए कई तरीकों में से एक को चुनना होगा, इसका मतलब है कि किसी भी वर्ण को बदलें जो MySQL में साइड इफेक्ट होगा।
- पुराने स्कूल MySQL + PHP में, mysql_real_escape_string () काम करता है। समस्या यह है कि इसे भूलना बहुत आसान है, इसलिए आपको तैयार बयान या क्वेरी बिल्डरों का बिल्कुल उपयोग करना चाहिए।
- MySQLi में, आप तैयार किए गए कथनों का उपयोग कर सकते हैं।
- अधिकांश चौखटे और सीएमएस क्वेरी बिल्डरों को प्रदान करते हैं जो इस कार्य में आपकी सहायता करते हैं।
यदि आप एक संख्या के साथ काम कर रहे हैं, तो आप भागने और उद्धरण को छोड़ सकते हैं (यही कारण है कि तैयार किए गए कथन एक प्रकार को निर्दिष्ट करने की अनुमति देते हैं)।
यह इंगित करना महत्वपूर्ण है कि आप SQL कथन के लिए चर से बचते हैं , और डेटाबेस के लिए ही नहीं । डेटाबेस मूल स्ट्रिंग को संग्रहीत करेगा, लेकिन वक्तव्य को एक बचा हुआ संस्करण चाहिए।
यदि आप इनमें से किसी एक को छोड़ देते हैं तो क्या होता है?
यदि आप फ़ॉर्म सत्यापन का उपयोग नहीं करते हैं , लेकिन आप अपने SQL इनपुट को साफ करते हैं, तो आपको सभी प्रकार के खराब सामान दिखाई दे सकते हैं, लेकिन आप SQL इंजेक्शन नहीं देखेंगे! (*)
सबसे पहले, यह आपके आवेदन को उस राज्य में ले जा सकता है जिसकी आपने योजना नहीं बनाई थी। उदाहरण के लिए, यदि आप सभी उपयोगकर्ताओं की औसत आयु की गणना करना चाहते हैं, लेकिन एक उपयोगकर्ता ने उम्र के लिए "अल्जकडाफ़र" दिया, तो आपकी गणना विफल हो जाएगी।
दूसरे, सभी प्रकार के अन्य इंजेक्शन हमले हो सकते हैं जिन पर आपको विचार करने की आवश्यकता है: जैसे उपयोगकर्ता इनपुट में जावास्क्रिप्ट या अन्य सामान हो सकता है।
डेटाबेस के साथ अभी भी समस्याएं हो सकती हैं: जैसे कि यदि कोई फ़ील्ड (डेटाबेस टेबल कॉलम) 255 वर्णों तक सीमित है, और स्ट्रिंग उससे अधिक लंबी है। या यदि फ़ील्ड केवल संख्याओं को स्वीकार करता है, और आप इसके बजाय एक गैर-संख्यात्मक स्ट्रिंग को बचाने का प्रयास करते हैं। लेकिन यह "इंजेक्शन" नहीं है, यह सिर्फ "एप्लिकेशन को क्रैश कर रहा है"।
लेकिन, यहां तक कि अगर आपके पास एक मुफ्त पाठ क्षेत्र है जहां आप बिना किसी सत्यापन के किसी भी इनपुट की अनुमति देते हैं, तो आप अभी भी डेटाबेस को इस तरह से बचा सकते हैं, अगर आप डेटाबेस के बयान पर जाते समय इसे ठीक से बचते हैं। समस्या तब आती है जब आप इस स्ट्रिंग का उपयोग कहीं करना चाहते हैं।
(*) या यह वास्तव में कुछ विदेशी होगा।
यदि आप SQL स्टेटमेंट के लिए वेरिएबल्स से नहीं बचते हैं , लेकिन आपने फॉर्म इनपुट को मान्य किया है, तो आप अभी भी खराब चीजें देख सकते हैं।
सबसे पहले, आप जोखिम लेते हैं कि जब आप डेटाबेस में डेटा को सहेजते हैं और इसे फिर से लोड करते हैं, तो यह अब समान डेटा नहीं होगा, "अनुवाद में खो गया"।
दूसरे, यह अमान्य SQL कथनों में परिणाम कर सकता है, और इस तरह आपके एप्लिकेशन को क्रैश कर सकता है। उदाहरण के लिए, यदि किसी भी चर में एक उद्धरण या दोहरा उद्धरण वर्ण है, तो आप किस प्रकार के उद्धरण का उपयोग करते हैं, इसके आधार पर आपको अमान्य MySQL कथन मिलेगा।
तीसरा, यह अभी भी SQL इंजेक्शन का कारण बन सकता है।
यदि प्रपत्रों से आपका उपयोगकर्ता इनपुट पहले से ही फ़िल्टर / मान्य है, तो जानबूझकर SQl इंजेक्शन की संभावना कम हो सकती है, यदि आपका इनपुट विकल्पों की हार्डकोड सूची में कम है, या यदि यह संख्याओं तक सीमित है। लेकिन किसी भी मुफ्त टेक्स्ट इनपुट का उपयोग SQL इंजेक्शन के लिए किया जा सकता है, यदि आप SQL स्टेटमेंट में वेरिएबल्स को ठीक से नहीं छोड़ते हैं।
और यहां तक कि अगर आपके पास कोई फॉर्म इनपुट नहीं है, तो भी आप सभी प्रकार के स्रोतों से तार ले सकते हैं: फाइलसिस्टम से पढ़ें, इंटरनेट से स्क्रैप किया गया है, आदि कोई भी गारंटी नहीं दे सकता है कि ये तार सुरक्षित हैं।
<select>
इनपुट में जो भी मान चाहिए, उन्हें सबमिट करने से रोकता है । वास्तव में भी थोड़ा तकनीकी उपयोगकर्ता ब्राउज़र कंसोल का उपयोग करके अतिरिक्त विकल्प जोड़ सकता है। यदि आप उपलब्ध मूल्यों की एक सरणी श्वेत सूची रखते हैं और इसके खिलाफ इनपुट की तुलना करते हैं, तो आप इसे कम कर सकते हैं (और आपको चाहिए क्योंकि यह अवांछित मूल्यों को रोकता है)