传递一个没有参数的查询到PreparedStatement是否安全?



我对Java很陌生,所以这肯定是一个愚蠢的问题。

我经常读到,当处理作为字符串处理的查询时,必须意识到SQL注入的风险。我还读到使用PreparedStatements是防止此类风险的好方法,但它们通常与查询中的位置参数一起使用(由问号?表示)。

如果我只有一个"常量"查询没有参数(即,我没有变量插入到我的查询)?我还需要在表单中传递查询吗"SELECT * from Table where col1 = ? and col2 = ?"到PreparedStatement来防止SQL注入?

或者我可以跳过吗"SELECT * from Table where col1 = 123 and col2 = 'abc'"

?我有这样的代码:

public ResultSet mySelectMethod(String query, Connection conn) {
ResultSet rset = null;
try {
PreparedStatement st = conn.PreparedStatement(query);   //I am unsure about this assignment
rset = st.executeQuery();
} catch (SQLException e) {
System.out.println(e);
}
return rset;
}
...
...
// method call:
String myQuery = "SELECT colA FROM table_name WHERE table_id = 192837465";
ResultSet myResultSet = mySelectMethod(myQuery, myConn);

这是安全的还是有什么问题?

由于您没有向查询传递任何参数,因此您没有SQL注入的风险。此外,您的案例不需要PreparedStatement。你可以用Statement代替。

String query = "SELECT * from Table where col1 = 123 and col2 = 'abc'";
try (Statement st = conn.createStatement()) {
ResultSet rset = stmt.executeQuery(query);
while (rs.next()) {
//...
}
} 
除此之外,正如你在上面的代码中看到的,你应该尝试使用try-with- resources语句来自动关闭资源。

最新更新