这是否会阻止SQL注入,或者我必须使用preparedStatement.setString()
String sqlQuery = "select st from master where st_id= %1s ";
sqlQuery = String.format(sqlQuery, id);
preparedStatement = conn.prepareStatement(sqlQuery);
rs = preparedStatement.executeQuery();
这不是代码审查,上面的代码就是问题的一个例子。
答案 0 :(得分:7)
您可以直接在SQL代码中嵌入用户输入:
String.format(sqlQuery, id)
有效地将用户输入作为代码运行。所以,不,这是SQL注入的不安全。这是SQL注入的定义。
使用prepared statement中的参数将用户输入视为值而不是代码,而不是直接将用户输入嵌入到SQL代码中。基本上,查询将变为:
String sqlQuery = "select st from master where st_id= ? ";
然后,您将使用该语言中的工具将参数值添加到查询中:
preparedStatement = conn.prepareStatement(sqlQuery);
preparedStatement.setInt(1, id); // <--- here
rs = preparedStatement.executeQuery();
附注:有些人可能会指出,如果id
是非字符串类型,则此代码仍然可以安全地进行SQL注入,因为没有人可以注入任何 dangerous 作为数字例如。虽然对于任何给定的实例,这可能在某种程度上为真,但它不能保证,仍然不安全。
始终将用户输入视为值,而不是代码。无论输入的类型如何,或者您确定如何确定输入的来源。不要给攻击者任何攻击途径,即使你无法想到他们可以利用它的任何方式。