PreparedStatements的安全性如何?

时间:2016-01-30 07:02:07

标签: java mysql security jdbc prepared-statement

我最近学会了不使用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不太了解,所以请原谅我这些是非常明显的问题。谢谢!

2 个答案:

答案 0 :(得分:1)

准备好的语句,如果使用得当,可以防止SQL注入。但请记住,Prepared语句只能保护数据,但不能保护程序本身。

看这里: How can prepared statements protect from SQL injection attacks?

答案 1 :(得分:1)

预准备语句中的值是您将可变数据与查询字符串本身分开。这提供了两个主要优点:

  1. 在重复查询的情况下,仅在发送的数据中不同,查询本身不需要重新解析;相反,只需要发送新数据。

  2. 您可以免受SQL注入攻击,这些攻击可能会导致查询字符串中直接包含不正确的转义数据,因为您的数据与查询字符串本身是分开的,并且是以安全的方式发送的。

  3. 准备好的语句(并且无意)保护您免受客户端与数据库之间的中间人攻击,这些攻击可能会改变您打算使用的查询(或数据)发送。为此,您需要使用SSL传输,否则确保攻击者无法在您与数据库的通信中插入自己。