在SQL(HSQLDB)中将完整的结果集转换为String

时间:2016-03-26 16:43:54

标签: java sql string hsqldb

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

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

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

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

总体上应该导致查询

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

然而,这会导致

  

org.hsqldb.HsqlException:基数违规

问题:

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

是否可以将完整的结果集转换为可在此SQL注入方案中使用的方式(在适用于HSQLDB的标准SQL / SQL中)?

1 个答案:

答案 0 :(得分:1)

你是对的,因为显然有多个用户从SELECT返回多行。

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

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