Java 在SQL(HSQLDB)中将完整的结果集转换为字符串
作为安全代码课程的一部分,我得到了一个易受攻击的Java系统,在该系统中,查询是使用字符串连接建立的,等等。以下是检索登录数据时必须SQL注入的相应代码行:Java 在SQL(HSQLDB)中将完整的结果集转换为字符串,java,sql,string,hsqldb,Java,Sql,String,Hsqldb,作为安全代码课程的一部分,我得到了一个易受攻击的Java系统,在该系统中,查询是使用字符串连接建立的,等等。以下是检索登录数据时必须SQL注入的相应代码行: String comment; int articleID; //... stmt.executeUpdate("INSERT INTO comment (text, article_id) VALUES ('" + comment + "', " + articleId + ")"); 注释可以设置为任何文本,它只是从文本框中读取纯文本
String comment;
int articleID;
//...
stmt.executeUpdate("INSERT INTO comment (text, article_id) VALUES ('" + comment + "', " + articleId + ")");
注释可以设置为任何文本,它只是从文本框中读取纯文本。因此,我考虑将textbox文本设置为SELECT语句,读取完整的登录数据表user has columns login and password:
总的来说,哪一个应该导致查询
INSERT INTO comment (text, article_id) VALUES ('' || (SELECT login || password FROM user) || '', 4)
然而,这导致了
org.hsqldb.hsqldb异常:基数冲突
问题:
我假设这是因为SELECT login | | password FROM user不是单个字符串,而是一个结果集,因此可能不会使用| |连接
是否可以将完整的结果集转换为一个字符串,以便在HSQLDB上工作的标准SQL/SQL的SQL注入场景中使用它?您是正确的,因为显然有多个用户,并且从SELECT返回多行 您可以将限制1添加到SELECT以获取第一行。还可以从内部选择创建字符串数组。请参阅指南 在HSQLDB中,每个数据库用户都有单独的表访问权限。在实际部署中,插入注释的用户甚至看不到包含密码的表的存在,更不用说从中进行选择了
INSERT INTO comment (text, article_id) VALUES ('' || (SELECT login || password FROM user) || '', 4)