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