से नीचे रोकता है नीचे दिया गया कोड SAMATE Reference Dataset से है। मैंने इसे एक स्थिर विश्लेषण उपकरण का परीक्षण करने के लिए उपयोग किया। जैसा कि आप देख सकते हैं कि कोड को सैनिटाइजेशन विधि के साथ-साथ तैयार कथन का उपयोग करके SQL-इंजेक्शन को रोकना चाहिए।क्या तैयार कथन SQL-इंजेक्शन को
चूंकि एससीए उपकरण कस्टम सैंटिज़ेशन विधियों को नहीं जानते हैं, इसलिए यह पता नहीं लगाएगा कि इंजेक्शन को रोकने के लिए allowed
विधि का उपयोग किया जाता है।
public class SQLInjection_good_089 extends HttpServlet
{
private static final long serialVersionUID = 1L;
public SQLInjection_good_089()
{
super();
}
// Table of allowed names to use
final String allowed_names[] = { "Mickael", "Mary",
"Peter", "Laura", "John"};
// Function to check if the current name takes part of the allowed ones
public boolean allowed(String in)
{
boolean bool = false;
for(int i = 0; i < 5; i++)
{
if(in.equals(allowed_names[i]))
{
// the current name is allowed to use
bool = true;
break;
}
}
return bool;
}
// Method which will be called to handle HTTP GET requests
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
// Initialize the output stream
resp.setContentType("text/html");
ServletOutputStream out = resp.getOutputStream();
out.println("<HTML><BODY><blockquote><pre>");
Connection conn = null;
// Get the parameter "name" from the data provided by the user
String name = req.getParameter("name");
if ((name != null) && (allowed(name) == true))
{
try
{
// Set the context factory to use to create the initial context
System.setProperty (Context.INITIAL_CONTEXT_FACTORY, "your.ContextFactory");
// Create the initial context and use it to lookup the data source
InitialContext ic = new InitialContext();
DataSource dataSrc = (DataSource) ic.lookup ("java:comp/env/jdbc:/mydb");
// Create a connection to the SQL database from the data source
conn = dataSrc.getConnection();
// Send a SQL request to the database
PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE firstname LIKE ?");
// replace the first parameter by name
ps.setString(1, name);
ps.executeQuery();
}
catch(NamingException e)
{
out.println("Naming exception");
}
catch(SQLException e)
{
out.println("SQL exception");
}
finally
{
try
{
if (conn != null)
conn.close();
}
catch (SQLException se)
{
out.println("SQL Exception");
}
}
}
else
return;
out.println("</pre></blockquote></body></html>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
}
}
फिर भी मुझे लगता है कि तैयार कथन के उपयोग को इंजेक्शन को वैसे भी रोकना चाहिए। क्या मैं गलत हूँ?
असल में यह मेरा एक गड़बड़ था। मैंने गलती से गलत परियोजना के परिणामों में देखा। कोई बात नहीं। धन्यवाद – er4z0r