java - 使用多个查询时 Java 和 MySQL 中的 SQL 注入(inject)

标签 java sql mysql security sql-injection

我有一个 Web 应用程序,其中包含 SQL 注入(inject)作为 INSERT 语句的一部分。它看起来像这样:

INSERT INTO table1 VALUES ('str1', 1, 'INJECTION HERE')

我可以插入常规的多查询注入(inject),例如 ');truncate table1;-- 但由于使用 Java + MySQL,它不允许堆叠多个查询,因此上述注入(inject)会导致 MySQL 出错,并且第二个查询永远不会被执行。

所以基本上看来,在上述架构中通过这种注入(inject)所能实现的一切就是注入(inject)“垃圾数据”,这在没有注入(inject)的情况下也是可能的。

还有更多技术,例如使用 load_file(),但这仍然不允许我将数据库操作到我想要的程度。

我在这里遗漏了什么吗?还有其他方法可以使用此注入(inject)来获得对数据库的控制吗?

最佳答案

当然,如果您将数据库/驱动程序组合从当前的实现更改为支持多个请求的组合,那么您将激活一个 hibernate 的安全漏洞(毫无疑问)人们会忘记这个漏洞!

忽略邪恶的恶意场景,上述内容将导致您在插入常规数据(包括引号字符等)时出现问题。即,上述内容对于特定数据集不起作用(除非经过清理/逃脱等)。我只是出于功能目的而更正它。

您应该看看PreparedStatement ,以及此的数据插入方法( setString() )等

例如:

   PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
                                     SET SALARY = ? WHERE ID = ?");
   pstmt.setBigDecimal(1, 153833.00)
   pstmt.setString(2, "Insert what you like here")

setString() 方法将支持任何字符串,而不会出现转义/注入(inject)问题。

关于java - 使用多个查询时 Java 和 MySQL 中的 SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1115739/

相关文章:

java - FTP 异常 501 "pathname"超过 8 个字符

java - 在 Java 中迭代可迭代对象直至满足条件或已完全迭代可迭代对象的最佳实践

php - 在 foreach codeigniter 中访问查询

PHP-更新表时出错

MySQL 表创建错误(语法对我来说很好)

mysql - 如何通过ADODB读取2个表

java - 在 BlueJ 中正确导入类

java - java android中的xml解析问题

asp.net - 将 Linq 转换为 SQL

sql - 搜索旅行计划的路线