preparedStatement是否避免SQL注入?

Moh*_*igh 34 java sql-injection jdbc prepared-statement

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

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

dar*_*ioo 55

使用字符串连接从任意输入构造查询将PreparedStatement不安全.看看这个例子:

preparedStatement = "SELECT * FROM users WHERE name = '" + userName + "';";
Run Code Online (Sandbox Code Playgroud)

如果有人提出

' or '1'='1
Run Code Online (Sandbox Code Playgroud)

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

SELECT * FROM users WHERE name = '' OR '1'='1';
Run Code Online (Sandbox Code Playgroud)

所以,如果你使用

preparedStatement = "SELECT * FROM users WHERE name = ?";
preparedStatement.setString(1, userName);
Run Code Online (Sandbox Code Playgroud)

你会安全的.

这些代码中的一部分取自本维基百科的文章.

  • @Mohamed:它有所作为.查询"SELECT*FROM users WHERE name =?"`将被发送到编译它的数据库,然后`setString`中的`userName`将被替换.如果数据库看到非法值,则会引发错误.因此,`'或'1'='1`将被视为一个完整的字符串,而不是作为涉及运算符`或`和`=`的语句.数据库将其视为一个值为""或"1"="1"的字符串. (16认同)
  • setString有什么区别吗?实际上它做了什么?甚至那将取代现场的字符串.它有什么不同? (8认同)