preparedStatement是否避免SQL注入?

时间:2010-12-02 08:21:56

标签: java jdbc prepared-statement sql-injection

我已阅读并尝试将易受攻击的SQL查询注入我的应用程序。这不够安全。我只是使用Statement Connection进行数据库验证和其他插入操作。

preparedStatements安全吗?而且这个陈述也会有问题吗?

4 个答案:

答案 0 :(得分:54)

使用字符串连接从任意输入构建查询不会使PreparedStatement安全。看一下这个例子:

preparedStatement = "SELECT * FROM users WHERE name = '" + userName + "';";

如果有人提出

' or '1'='1

作为userName,您的PreparedStatement将容易受到SQL注入攻击,因为该查询将在数据库上执行

SELECT * FROM users WHERE name = '' OR '1'='1';

所以,如果你使用

preparedStatement = "SELECT * FROM users WHERE name = ?";
preparedStatement.setString(1, userName);

你会安全的。

部分代码来自this Wikipedia article

答案 1 :(得分:2)

准备好的语句如果使用得当,可以防止SQL注入。但请在您的问题中发布代码示例,以便我们查看您是否正确使用它。

答案 2 :(得分:1)

简单地使用PreparedStatement并不能确保您的安全。您必须在SQL查询中使用PreparedStatement可能的参数。查看here了解更多信息。

答案 3 :(得分:1)

this article中所述,如果您仍在连接字符串,PreparedStatement单独对您没有帮助。

例如,一名流氓攻击者仍然可以执行以下操作:

不仅仅是SQL可以受到影响。如果你没有使用绑定参数,甚至可以破坏JPQL。

最重要的是,在构建SQL语句时,不应该使用字符串连接。为此目的使用专用API: