आप उपयोगकर्ता नाम सीधे SQL में बिना भागे या उद्धृत किए सम्मिलित कर रहे हैं। मुझे लगता है कि आप बस धर्मत्यागी से चूक गए।
SQL इंजेक्शन समस्याओं को रोकने के लिए, कभी भी गतिशील डेटा से SQL स्ट्रिंग स्थिरांक सम्मिलित न करें, हमेशा तैयार किए गए स्टेटमेंट का उपयोग करें और मार्कर डालें।
वैकल्पिक रूप से, मानों से बचें, लेकिन मार्करों का उपयोग करना अधिक सुरक्षित है, और डेटाबेस को संकलित SQL कथन को कैश करने की अनुमति देकर SQL प्रदर्शन में सुधार करता है।
String updateQuery = "UPDATE " + USER_TABLE +
" SET " + USER_TABLE_FIRST_NAME + "=IFNULL(? ," + USER_TABLE_FIRST_NAME + ")," +
USER_TABLE_LAST_NAME + "=?," +
USER_TABLE_ABOUT_ME + "=?," +
USER_TABLE_CITY + "=?," +
USER_TABLE_DOB + "=?" +
" WHERE " + USER_TABLE_ID + "=?";
PreparedStatement stmt = conn.prepareStatement(updateQuery);
stmt.setString(1, user.getFirstName());
stmt.setString(2, user.getLastName());
stmt.setString(3, user.getAboutMe());
stmt.setString(4, user.getCity());
stmt.setString(5, user.getDateOfBirth());
stmt.setString(6, user.getUserId());
नोट: शून्य चेक समस्या को कवर करने के लिए उत्तर बढ़ाया गया।
जब आप साधारण स्ट्रिंग इंजेक्शन का उपयोग कर रहे हों, "A='" + name + "'"
हो जाता है A='Joe'
एक गैर-शून्य मान के लिए लेकिन A='null'
एक शून्य मान के लिए, जो निश्चित रूप से वह नहीं है जो आप चाहते हैं।
पैरामीटर मार्करों का उपयोग करके, ?
. का मान null
हो सकता है , जिसका अर्थ है कि IFNULL(?, Name)
आवश्यक सटीक व्यवहार देगा, यानी ?
. के मान का उपयोग करना जब यह रिक्त न हो, और NAME
. का मान कब ?
शून्य है।