Java preparedStatement是否避免SQL注入?

Java preparedStatement是否避免SQL注入?,java,jdbc,prepared-statement,sql-injection,Java,Jdbc,Prepared Statement,Sql Injection,我已经阅读并尝试将易受攻击的sql查询注入到我的应用程序中。这不够安全。我只是将语句连接用于数据库验证和其他插入操作 准备好的报表安全吗?而且,这个语句也会有问题吗?如果使用得当,准备好的语句可以防止SQL注入。但是请在你的问题上贴一个代码示例,这样我们就可以知道你是否正确地使用了它。好吧,简单地使用PreparedStatement并不能保证你的安全。您必须在SQL查询中使用参数,这可以通过PreparedStatement实现。查看更多信息。使用字符串连接从任意输入构造查询不会使Prepar

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


准备好的报表安全吗?而且,这个语句也会有问题吗?

如果使用得当,准备好的语句可以防止SQL注入。但是请在你的问题上贴一个代码示例,这样我们就可以知道你是否正确地使用了它。

好吧,简单地使用
PreparedStatement
并不能保证你的安全。您必须在
SQL
查询中使用参数,这可以通过
PreparedStatement
实现。查看更多信息。

使用字符串连接从任意输入构造查询不会使
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);
你会安全的

如果您仍在连接字符串,则从中提取的部分代码。

单独使用不会对您有所帮助

例如,一个恶意攻击者仍然可以执行以下操作:

  • 调用sleep函数,使所有数据库连接都处于繁忙状态,从而使应用程序不可用
  • 从数据库中提取敏感数据
受影响的不仅仅是SQL。如果不使用绑定参数,甚至JPQL也会受到影响

总之,在构建SQL语句时,不应该使用字符串连接。为此,请使用专用API:


事先准备好的声明才是正确的选择。一个准备好的语句只会被解析一次,所以在以后的日子里不可能进行SQL注入。当然,您仍然需要清理输入以防止XSS攻击等。设置字符串有什么区别吗?它实际上是做什么的?即使这样,也会取代原来的绳子。它有什么不同?@穆罕默德:它有不同。查询
“从用户名=?”的用户中选择*”
将被发送到编译它的数据库,然后将替换
设置字符串中的
用户名。如果数据库看到非法值,它将抛出一个错误。因此,
'或'1'='1
将被视为一个完整的字符串,而不是包含运算符
=
的语句。数据库会将其视为一个值为“
”或“1”=“1”
的字符串。