Java preparedStatement是否避免SQL注入?
我已经阅读并尝试将易受攻击的sql查询注入到我的应用程序中。这不够安全。我只是将语句连接用于数据库验证和其他插入操作Java preparedStatement是否避免SQL注入?,java,jdbc,prepared-statement,sql-injection,Java,Jdbc,Prepared Statement,Sql Injection,我已经阅读并尝试将易受攻击的sql查询注入到我的应用程序中。这不够安全。我只是将语句连接用于数据库验证和其他插入操作 准备好的报表安全吗?而且,这个语句也会有问题吗?如果使用得当,准备好的语句可以防止SQL注入。但是请在你的问题上贴一个代码示例,这样我们就可以知道你是否正确地使用了它。好吧,简单地使用PreparedStatement并不能保证你的安全。您必须在SQL查询中使用参数,这可以通过PreparedStatement实现。查看更多信息。使用字符串连接从任意输入构造查询不会使Prepar
准备好的报表安全吗?而且,这个语句也会有问题吗?如果使用得当,准备好的语句可以防止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函数,使所有数据库连接都处于繁忙状态,从而使应用程序不可用
- 从数据库中提取敏感数据
“从用户名=?”的用户中选择*”
将被发送到编译它的数据库,然后将替换设置字符串中的用户名。如果数据库看到非法值,它将抛出一个错误。因此,'或'1'='1
将被视为一个完整的字符串,而不是包含运算符或和=
的语句。数据库会将其视为一个值为“”或“1”=“1”
的字符串。