एक काल्पनिक मामले पर विचार करें, जहां मैं नीचेएसक्यूएल इंजेक्शन हमलों को रोकने के लिए बयान तैयार किए जाएंगे?
private String getpassword(String username) {
PreparedStatement statement = null;
ResultSet resultSet = null;
Connection conn = null;
final String selectQuery = "SELECT password FROM " + "users WHERE username=?";
try {
conn = dataSource.getConnection();
statement = conn.prepareStatement(selectQuery);
statement.setString(1, username);
resultSet = statement.executeQuery();
if (resultSet.next()) {
}
} catch (SQLException e) {
// log it
}
//return
}
इस उपयोगकर्ता नाम दिया जाता है डेटाबेस userId और नमूना कोड के आधार पर से कुछ विवरणों को प्राप्त करने के लिए है वास्तव में ग्राहक की ओर से आ रहा है और उपयोगकर्ता डेटा छेड़छाड़ कर सकते हैं (अगर वह चाहता है)। तो तैयार होगा स्टेटमेंट्स उद्धरण स्वीकार करने से रोकें और डेटाबेस में केवल SQL के फ़िल्टर किए गए फॉर्म को भेजें।
उदाहरण के लिए: मैं उपयोगकर्ता नाम = 'या 1 = 1 प्रदान कर सकता हूं और यह एक वैध SQL कथन होगा। लेकिन यदि ड्राइवर उपयोगकर्ता इनपुट से उद्धरण से बच निकलता है, तो वे एसक्यूएल इंजेक्शन को रोक देंगे।
इसकी सामान्य समझ क्या है?
मेरे पिछले गलत जवाब (निकाला गया) के लिए खेद है। लगता है कि वे काम करता है। इस पोस्ट को देखें: http://stackoverflow.com/questions/1812891/java-escape-string-to-prevent-sql-injection – Heisenbug
उचित भागने से एसक्यूएल इंजेक्शन को रोकना तैयार बयानों के कारणों में से एक है। – Jacob
संभावित डुप्लिकेट [क्या मैं पैरामीटर का उपयोग करके सभी एसक्यूएल-इंजेक्शन हमलों से बच सकता हूं?] (Http://stackoverflow.com/questions/3736831/can-i-avoid-all-sql-injection-attacks-by-using-parameters) – Thilo