SQL इंजेक्शन एक बहुत ही गंभीर सुरक्षा मुद्दा है, बड़े हिस्से में क्योंकि इसे गलत करना बहुत आसान है: उपयोगकर्ता इनपुट को शामिल करते हुए क्वेरी बनाने के लिए स्पष्ट, सहज ज्ञान युक्त तरीका आपको कमजोर बनाता है, और इसे कम करने का सही तरीका आपको पैरामीटर के बारे में जानने की आवश्यकता है प्रश्न और एसक्यूएल इंजेक्शन पहले।
मुझे लगता है कि इसे ठीक करने का स्पष्ट तरीका स्पष्ट (लेकिन गलत) विकल्प को बंद करना होगा: डेटाबेस इंजन को ठीक करें ताकि प्राप्त कोई भी क्वेरी जो मापदंडों के बजाय अपने WHERE खंड में हार्ड-कोडित मूल्यों का उपयोग करता है, एक अच्छा, वर्णनात्मक रिटर्न देता है त्रुटि संदेश आपको इसके बजाय मापदंडों का उपयोग करने का निर्देश देता है। यह स्पष्ट रूप से एक ऑप्ट-आउट विकल्प की आवश्यकता होगी ताकि प्रशासनिक उपकरणों से तदर्थ प्रश्नों जैसे सामान अभी भी आसानी से चलेंगे, लेकिन इसे डिफ़ॉल्ट रूप से सक्षम किया जाना चाहिए।
ऐसा करने से SQL इंजेक्शन ठंड बंद हो जाएगा, लगभग रात भर, लेकिन जहाँ तक मुझे पता है, कोई RDBMS वास्तव में ऐसा नहीं करता है। क्या कोई अच्छा कारण है क्यों नहीं?
SELECT * FROM jokes WHERE date > DATE_SUB(NOW(), INTERVAL 1 DAY) ORDER BY score DESC;
"bad"
शाब्दिक है या स्ट्रिंग संघनन से उत्पन्न हुआ है। मेरे द्वारा देखे जाने वाले दो समाधान या तो एसक्यूएल और अन्य स्ट्रिंग-एम्बेडेड डीएसएल (हाँ कृपया) से छुटकारा पा रहे हैं, या उन भाषाओं को बढ़ावा दे रहे हैं, जहां पैरामीटर क्वेरीज़ (umm, no) का उपयोग करने की तुलना में स्ट्रिंग कॉन्सेन्टेशन अधिक कष्टप्रद है।
bad_ideas_sql = 'SELECT title FROM idea WHERE idea.status == "bad" AND idea.user == :mwheeler'
एक ही क्वेरी में हार्ड-कोडित और पैरामीटर किए गए मान दोनों होंगे - जो पकड़ने की कोशिश करें! मुझे लगता है कि इस तरह के मिश्रित प्रश्नों के लिए वैध उपयोग के मामले हैं।