java - ReadyStatement 的安全性如何?

标签 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等,或者向查询中注入(inject)其他操作?

正如您可能知道的那样,我对安全性和 MySQL 不太了解,所以如果这些是非常明显的问题,请原谅。谢谢!

最佳答案

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

  1. 如果重复查询仅发送的数据不同,则查询本身不需要重新解析;相反,只需要发送新数据。

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

    <

准备好的语句不会(也无意)保护您免受客户端和数据库之间的中间人攻击,这些攻击可能会改变您想要的查询(或数据)发送。为此,您需要使用 SSL 传输,否则请确保攻击者无法介入您与数据库的通信。

关于java - ReadyStatement 的安全性如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35099050/

相关文章:

java - 单个线程应该只从连接池获取单个连接吗?

Java - 类型转换问题

php - 单击选择菜单中的值时显示数据库数据

mysql - 转义字符串不起作用

Java EE 7 动态用户角色

linux - 64位系统格式化字符串漏洞利用

Java - Swing 表单在被调用时显示为空

java - 动态改变方法的返回类型

mysql - 理解 slow.log mysql

Spring security login-processing-url 抛出 405 请求方法 POST 不支持