Java 准备好的报表有多安全?
我最近了解到,不使用PreparedStatements的.set()方法是一个非常严重的安全缺陷 在看了一些代码示例之后,我对PreparedStatements及其安全性提出了一些问题 如果有人可以通过攻击MySQL查询来更改数据,PreparedStatement的.set()方法到底如何防止攻击 例如,如果查询是Java 准备好的报表有多安全?,java,mysql,security,jdbc,prepared-statement,Java,Mysql,Security,Jdbc,Prepared Statement,我最近了解到,不使用PreparedStatements的.set()方法是一个非常严重的安全缺陷 在看了一些代码示例之后,我对PreparedStatements及其安全性提出了一些问题 如果有人可以通过攻击MySQL查询来更改数据,PreparedStatement的.set()方法到底如何防止攻击 例如,如果查询是 INSERT INTO table_name(?, ?); UPDATE table_name SET column_name=?; SELECT column_name
INSERT INTO table_name(?, ?);
UPDATE table_name SET column_name=?;
SELECT column_name FROM table_name WHERE column2_name = ?;
(假设两个问号都是字符串)
有人不能简单地将表名称更改为另一个表吗
另一个例子;
如果查询是
INSERT INTO table_name(?, ?);
UPDATE table_name SET column_name=?;
SELECT column_name FROM table_name WHERE column2_name = ?;
一个人不能更改列名以使查询更改为不同的列吗
我能想到的最后一个例子;
如果查询是
INSERT INTO table_name(?, ?);
UPDATE table_name SET column_name=?;
SELECT column_name FROM table_name WHERE column2_name = ?;
攻击者是否可能修改列名称、表名称等,或向查询中插入其他操作
正如您可能知道的,我对安全性和MySQL知之甚少,所以如果这些问题非常明显,请原谅。谢谢大家! 如果使用得当,准备好的语句可以防止SQL注入。但是请记住,准备好的语句只能保护数据,但不能保护程序本身 看这里:
如果使用得当,准备好的语句可以防止SQL注入。但是请记住,准备好的语句只能保护数据,但不能保护程序本身 看这里:
准备语句中的值是将变量数据与查询字符串本身分开。这提供了两个主要优势:
准备好的语句不会(也不打算)保护您免受客户端和数据库之间的中间人攻击,这些攻击可能会改变您要发送的查询(或数据)。为此,您需要使用SSL传输,否则将确保攻击者无法介入您与数据库的通信。准备语句中的值是将变量数据与查询字符串本身分离。这提供了两个主要优势:
准备好的语句不会(也不打算)保护您免受客户端和数据库之间的中间人攻击,这些攻击可能会改变您要发送的查询(或数据)。为此,您需要使用SSL传输,否则将确保攻击者无法介入您与数据库的通信。好的。因此,其要点是SQL注入攻击只能修改查询中发送的数据,而不能修改查询本身?而且MITM攻击实际上能够修改查询?(谢谢你的回复。顺便说一句)。成功的SQL注入攻击意味着你的数据是查询字符串本身的一部分,而漏洞在于查询会做一些你不想做的事情,而不仅仅是不正确的数据进入数据库。如果数据与查询分离,那么任何恶意输入都只是数据的一部分。如果攻击者能够读取和修改数据,MITM可能会影响应用程序通过攻击者的任何内容。(但请注意,只读MITM仍然可能是危险的。)好的。因此,其要点是SQL注入攻击只能修改查询中发送的数据,而不能修改查询本身?而且MITM攻击实际上能够修改查询?(谢谢你的回复。顺便说一句)。成功的SQL注入攻击意味着你的数据是查询字符串本身的一部分,而漏洞在于查询会做一些你不想做的事情,而不仅仅是不正确的数据进入数据库。如果数据与查询分离,那么任何恶意输入都只是数据的一部分。如果攻击者能够读取和修改数据,MITM可能会影响应用程序通过攻击者的任何内容。(但请注意,只读MITM仍然可能是危险的。)好的,这更清楚了一点,谢谢。好的,这更清楚了一点,谢谢。