इस तरह से एक क्वेरी बनाना एसक्यूएल इंजेक्शन हमलों के लिए कमजोर बना देता है जब तक कि आप मैन्युअल रूप से अपने इनपुट से बच नहीं गए हैं (आईई ने डेटाबेस इंजन विशिष्ट एस्केप अनुक्रमों का उपयोग करके क्वेरी की संरचना को बदलने के लिए 'प्रोजेक्ट आईडी' के मूल्य के लिए असंभव बना दिया है)। हालांकि, ऐसा करने का अनुशंसित तरीका पैरामीटरयुक्त प्रश्नों (कभी-कभी "तैयार विवरण" कहा जाता है) का उपयोग कर रहा है। पैरामीटरयुक्त प्रश्नों के साथ, आप केवल क्वेरी की संरचना को परिभाषित करते हैं और फिर इनपुट मानों को पैरामीटर के रूप में अलग से प्रदान करते हैं, जिससे आपकी क्वेरी की संरचना को SQL इंजेक्शन के माध्यम से कभी भी परिवर्तित होने से रोका जा सकता है।
यहाँ आपका उदाहरण है, पैरामीटरकरण का उपयोग करने के लिए बदला गया:
public DataSet GetProject(string projectID)
{
DataSet dataTable = new DataSet();
DataAccess dataAccess = new DataAccess();
OracleCommand commandOb = new OracleCommand();
strQuery = @"select projectName, managerName
from project
where projectID = :ProjectID"
cmd.CommandText = strQuery;
cmd.Parameters.AddWithValue("ProjectID", projectID);
dataTable = dataAccess.ExecuteDataAdapter(commandOb);
return dataTable;
}
क्वेरी में पैरामीटर ':ProjectID' को 'AddWithValue' पद्धति में दिए गए मान से बदल दिया जाएगा। कोई फर्क नहीं पड़ता कि 'प्रोजेक्ट आईडी' चर में क्या मूल्य है, इसका मूल्यांकन हमेशा WHERE क्लॉज के हिस्से के रूप में किया जाएगा। जबकि, पहले, ['; के समान मान; प्रोजेक्ट से हटाएं;--] आपकी क्वेरी को निम्नानुसार पढ़ने के लिए बदलकर अवांछित प्रभाव डाल सकता है:
select projectName, managerName
from project
where projectID = ''; DELETE FROM project;--'