我最近学会了不使用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等。或者在查询中注入其他操作?
你可能会说,我对安全性和MySQL不太了解,所以请原谅我这些是非常明显的问题。谢谢!
答案 0 :(得分:1)
准备好的语句,如果使用得当,可以防止SQL注入。但请记住,Prepared语句只能保护数据,但不能保护程序本身。
看这里: How can prepared statements protect from SQL injection attacks?
答案 1 :(得分:1)
预准备语句中的值是您将可变数据与查询字符串本身分开。这提供了两个主要优点:
在重复查询的情况下,仅在发送的数据中不同,查询本身不需要重新解析;相反,只需要发送新数据。
您可以免受SQL注入攻击,这些攻击可能会导致查询字符串中直接包含不正确的转义数据,因为您的数据与查询字符串本身是分开的,并且是以安全的方式发送的。
准备好的语句不(并且无意)保护您免受客户端与数据库之间的中间人攻击,这些攻击可能会改变您打算使用的查询(或数据)发送。为此,您需要使用SSL传输,否则确保攻击者无法在您与数据库的通信中插入自己。