preparedStatement是否避免SQL注入?

我已阅读并尝试将易受攻击的SQL查询注入到我的应用程序中。 这是不够安全的。 我只是使用语句连接进行数据库validation和其他插入操作。

preparedStatements安全吗? 而且这个说法也会有什么问题吗?

使用string连接来从任意input构build查询不会使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); 

你会安全的。

这些代码取自这篇维基百科文章 。

准备好的语句如果使用得当,可以防止SQL注入。 但是,请发布一个代码示例到你的问题,所以我们可以看到你是否正确使用它。

那么简单地使用PreparedStatement并不能保证你的安全。 您必须在PreparedStatement使用SQL查询中的参数。 在这里寻找更多的信息。

正如在这篇文章中所解释的那样, PreparedStatement本身并不能帮助你,如果你还在串联string。

例如,一个stream氓攻击者仍然可以做到以下几点:

  • 调用一个睡眠函数,以便所有的数据库连接都会忙碌,因此使您的应用程序不可用
  • 从数据库中提取敏感数据
  • 绕过用户authentication

而且不仅仅是SQL可能会受到影响。 如果您不使用绑定参数,即使JPQL也会受到影响。

底线,在构buildSQL语句时,不应该使用string连接。 为此目的使用专用的API:

  • JPA标准API
  • jOOQ