这段代码SQL注入是安全的吗?

时间:2016-02-01 14:43:12

标签: java

这是否会阻止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();

这不是代码审查,上面的代码就是问题的一个例子。

1 个答案:

答案 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 作为数字例如。虽然对于任何给定的实例,这可能在某种程度上为真,但它不能保证,仍然不安全。

始终将用户输入视为值,而不是代码。无论输入的类型如何,或者您确定如何确定输入的来源。不要给攻击者任何攻击途径,即使你无法想到他们可以利用它的任何方式。