java - 将不带参数的查询传递给 PreparedStatement 是否安全?

标签 java jdbc prepared-statement sql-injection

我是 Java 的新手,所以这肯定是个愚蠢的问题。

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

如果我只有一个没有参数的“常量”查询(即,我没有要在查询中插入的变量)怎么办?我是否还必须通过表单中的查询 “SELECT * from Table where col1 = ? and col2 =?” 到 PreparedStatement 来防止 SQL 注入(inject)?

或者我可以通过 “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 注入(inject)的风险。此外,您的情况不需要 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 - 将不带参数的查询传递给 PreparedStatement 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65946018/

相关文章:

java - 使用JDBC和MySQL解决“通信链接失败”问题

java - 需要快速学习java框架的帮助

Java JDBC 类型转换(Firebird/Jaybird): check value/type compatibility before using getter or updater ResultSet method?

mysqli - 使用 mysqli 获取准备好的语句的实际 SQL?

java - 如何将我的 ListView 适配器转换为 RecyclerView 适配器?

java - com.sun.jdi.InvocationException 发生调用方法

java - 动态创建矩形网格

Java将读取的行分割成字符串然后使用它们

php - 如何在准备好的语句中使用sql函数

php - 检测 mysqli 准备语句中的错误