我已经阅读并尝试向我的应用程序注入易受攻击的SQL查询,但这样做不够安全。我只是使用Statement Connection对数据库进行验证和其他插入操作。
使用preparedStatements是否安全?此外,这个语句是否也存在问题?
我已经阅读并尝试向我的应用程序注入易受攻击的SQL查询,但这样做不够安全。我只是使用Statement Connection对数据库进行验证和其他插入操作。
使用preparedStatements是否安全?此外,这个语句是否也存在问题?
使用字符串拼接来构建查询语句并不会使 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);
你会安全的。
这段代码部分取自维基百科上的文章。
"SELECT * FROM users WHERE name = ?"
将被发送到数据库,编译后setString
中的userName
将被替换。如果数据库看到非法值,它将抛出错误。因此,' or '1'='1
将被视为整个字符串,而不是涉及运算符or
和=
的语句。数据库将其视为带有值"' or '1'='1"
的字符串。” - darioo如果正确使用,预处理语句可以保护免受SQL注入攻击。但是,请在您的问题中发布一个代码示例,以便我们可以查看您是否正确使用它。
PreparedStatement
单独使用并不能帮助您,如果您仍在拼接字符串。
例如,一个恶意攻击者仍然可以执行以下操作:
这不仅仅是SQL受到影响。即使是JPQL也可能会被破坏,如果您没有使用绑定参数。
底线是,在构建SQL语句时永远不要使用字符串拼接。使用专门的API来完成此任务:
仅仅使用PreparedStatement
并不能保证您的安全。您必须在SQL
查询中使用参数,这是通过PreparedStatement
实现的。请查看此处以获取更多信息。