将不带参数的查询传递给 PreparedStatement 是否安全?
Is it safe to pass a query with no parameters to 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-resorces statement 来自动关闭资源。
我对 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-resorces statement 来自动关闭资源。