java - 在 SQL 中将完整结果集转换为字符串 (HSQLDB)

标签 java sql string hsqldb

作为安全代码类(class)的一部分,我获得了一个易受攻击的 Java 系统,其中使用字符串连接等方式构建查询。以下是我必须通过 SQL 注入(inject)来检索登录数据的相应代码行:

String comment;
int articleID;
//...
stmt.executeUpdate("INSERT INTO comment (text, article_id) VALUES ('" + comment + "', " + articleId + ")");

comment 可以设置为任何文本,它只是从文本框中读取纯文本。因此,我考虑将文本框文本设置为 SELECT 语句,读取完整的登录数据(表 user 具有列 login密码):

' || (SELECT login || password FROM user) || '

总体上应该会导致查询

INSERT INTO comment (text, article_id) VALUES ('' || (SELECT login || password FROM user) || '', 4)

然而,这会导致

org.hsqldb.HsqlException: cardinality violation

问题:

我认为这是因为 (SELECT login || password FROM user) 不是单个字符串,而是一个结果集,因此可能无法使用 || 连接>.

是否可以将完整的结果集转换为一个字符串,以一种可用于此 SQL 注入(inject)场景(在适用于 HSQLDB 的标准 SQL/SQL 中)的方式?

最佳答案

您是对的,因为显然有多个用户,并且 SELECT 返回了多行。

您可以将 LIMIT 1 添加到 SELECT 来获取第一行。您还可以从内部 SELECT 创建字符串数组。请参阅指南。

在 HSQLDB 中,每个数据库用户对表都有单独的访问权限。在实际部署中,插入注释的用户甚至不会看到包含密码的表的存在,更不用说从中进行选择了。

关于java - 在 SQL 中将完整结果集转换为字符串 (HSQLDB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36237970/

相关文章:

java - scala 模式匹配

java - SWT:透明外壳也使小部件透明

mysql - SQL - 查找列中计数最高的对象

java - 从字符串中获取第一个具有随机数字的值

java - 在 if 语句中使用字符串数组的值

java - 为什么我的程序不能将信息写入文件?

java - JDBC 预处理语句 select from table where

mysql - 使用 CASE 选择特定行的 SQL 查询

sql - 将 SQL 查询转换为 ActiveRecord 查询

C# String 处理非定界字符串列表