JdbcTemplate动态表名与SQL注入问题

6

我对使用Spring的JdbcTemplate编写类似下面代码的SQL注入存在疑虑:

jdbcTemplate.query("SELECT * FROM " + tableName, new TableMapper());

由于不能使用JdbcTemplate传递参数,因此需要通过连接来添加“tableName”变量。

只有管理员才能编辑“tableName”变量,但我想知道是否可以在此查询中进行SQL注入攻击。

否则,请描述一种安全的方法来完成这个操作?


你在tableName上进行了任何类型的清洁吗? - EM-Creations
不,我不知道如何有效地进行清理,因为我不知道表名。你有什么想法吗? - xte
它应该从现有的表/视图列表中选择,而不是编辑。可用表格列表的获取取决于数据库。在您的问题中添加适当的数据库标签。 - StanislavL
代码旨在作为库使用,我无法控制未来的接口,但确实可以在执行任何查询之前检查表是否存在。谢谢。 - xte
1
在这种情况下,您可以通知库的用户他们需要负责对表名进行消毒等操作吗? - EM-Creations
是的,那确实是目前的计划。问题是我不确定是否真的需要它。在那里插入SQL代码真的可行吗?在JdbcTemplate中,表名除了连接之外真的没有其他选择吗? - xte
3个回答

1
这里是一个使用Java 17+的改进答案。
 String prepQuery = "INSERT INTO %s( name, dataid, groupid, uniqueid, type, filecontainer, filetype, fileurl, filepath, uploadstatus) VALUES (?,?,?,?,?,?,?,?,?,?)";
   Object[] params = new Object[] {
          name,
          dataid,
          groupid,
          uniqueid,
          type,
          container,
          filetype,
          file_url,
          path,
          filePresent
  };
  int i = jdbcTemplate.update(prepQuery.formatted(dataid) ,params);

注意:已更改查询以使用 %s。这里使用了一个名为 formatted 的实例版本的 String::format

1
  String prepQuery = "INSERT INTO $tabname ( name, dataid, groupid, uniqueid, type, filecontainer, filetype, fileurl, filepath, uploadstatus) VALUES (?,?,?,?,?,?,?,?,?,?)";
   Object[] params = new Object[] {
          name,
          dataid,
          groupid,
          uniqueid,
          type,
          container,
          filetype,
          file_url,
          path,
          filePresent
  };
  prepQuery = prepQuery.replace("$tableName",dataid);
  int i = jdbcTemplate.update(prepQuery ,params);

这只是一个备选方案,但无法以动态方式传递表名。
参考 doc

-7

是的,这是可能的。我建议您将代码修改为以下内容:

jdbcTemplate.query("SELECT * FROM ?", new Object[]{tableName},new TableMapper());

这个安全地将tableName插入到你的查询中;)


5
遗憾的是,在jdbc - jdbcTemplate中无法将表名作为参数传递。其他参数可以作为参数传递,但表名无法以这种方式传递。 - xte

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接