我最近了解到不使用PreparedStatements 的.set() 方法是一个相当大的安全缺陷。
查看一些代码示例后,我对PreparedStatements 及其安全性有一些疑问。
如果有人可以攻击 MySQL 查询来更改数据,PreparedStatement 的 .set() 方法到底如何防止攻击?
例如,如果查询是
INSERT INTO table_name(?, ?);
(假设两个问号都是字符串)
有人不能简单地将 table_name 更改为另一个表吗?
另一个例子; 如果查询是
UPDATE table_name SET column_name=?;
人们不能更改column_name以使查询更改不同的列吗?
我能想到的最后一个例子; 如果查询是
SELECT column_name FROM table_name WHERE column2_name = ?;
攻击者是否有可能修改column_name、table_name等,或者向查询中注入(inject)其他操作?
正如您可能知道的那样,我对安全性和 MySQL 不太了解,所以如果这些是非常明显的问题,请原谅。谢谢!
最佳答案
准备好的语句中的值(value)是将变量数据与查询字符串本身分开。这提供了两个主要优点:
如果重复查询仅发送的数据不同,则查询本身不需要重新解析;相反,只需要发送新数据。
您可以免受 SQL 注入(inject)攻击,这些攻击可能会导致查询字符串中直接包含不正确的转义数据,因为您的数据与查询字符串本身是分开的,并且以安全的方式发送。
<
准备好的语句不会(也无意)保护您免受客户端和数据库之间的中间人攻击,这些攻击可能会改变您想要的查询(或数据)发送。为此,您需要使用 SSL 传输,否则请确保攻击者无法介入您与数据库的通信。
关于java - ReadyStatement 的安全性如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35099050/