【问题标题】:PreparedStatement with table name带表名的 PreparedStatement
【发布时间】:2021-05-17 07:29:50
【问题描述】:

我的代码中有一个漏洞,我正在尝试修复它。

为此,在 SQL 查询中,我使用 PreparedStatements 安全地注入参数,如下所示:

String runQuery(String value) {

   String myReturn;
   String query = "select VALUE from " + tableName + " where config = ?";

   try(PreparedStatement ps = con.prepareStatement(query)){
      ps.setString(1, value);
      try(ResultSet rs = ps.executeQuery()) {
         if (rs.next()) {
            myReturn = rs.getString(1);
         } else {
            throw new BusinessException("noSQLResultSet");
         }
      }
   } catch (Exception sqlException) {
      throw new BusinessException("SQLException");
   }
   return myReturn;
}

我的问题是关于表的名称tableName,我目前正在从位于服务器上的属性文件中检索它,但是从我看到的 PreparedStatements 中我无法注入表的名称,因为它是不允许的.如何在不连接查询中的值的情况下以安全的方式指定表名?

【问题讨论】:

  • 为什么是表名变量?不知道配置在哪个表?
  • 您如何检查tableName 是否具有适当的值?就像您可以检查它只是一个 SQL 标识符,而不是任何更复杂的表达式;或者您可以检查它是一组已知的允许表名之一。

标签: java sql jdbc prepared-statement


【解决方案1】:

表名不能用作PreparedStatement 中的参数。必须是hard coded

【讨论】:

    【解决方案2】:

    我可以看到您已经创建了包含 tableName 的查询。动态连接查询和参数是不行的,因为如果您从前端接收到像“或 1=1”这样的参数,您很容易受到 sql 注入的影响,但这里不是这种情况,因为您是单独提供参数的。无论如何,让表名可配置听起来有点奇怪。

    【讨论】:

      【解决方案3】:

      没有特别简单的方法;一种解决方案是将输入列入白名单:如果它仅由字母和下划线组成,则可以。

      请注意,您的异常处理很糟糕,您正在丢弃所有有用的信息!试试 throw new BusinessException("uncaught", e); - 如果 BusinessException 是您的代码,请确保添加该构造函数(您可以直接调用 super(msg, cause);)。

      【讨论】:

        【解决方案4】:

        我猜您想从属性中获取tableName 的原因是您的架构处于不断变化的状态(?)......在开发环境中并不罕见。 如果是这种情况,从您的属性中获取它不会引入漏洞,并且如果您使用的是Spring,我相信您可以使用如下注释:
        @ConfigurationProperties(prefix = "schema.properties")
        在您的班级中,添加如下字段:
        private String tableName;
        在课堂里。如果是这种情况,并且您在 applications.properties 文件(或特定于环境的等效项)中有一个字段称为:
        schema.properties.tableName = myTableName
        我认为你应该很高兴。

        【讨论】:

          猜你喜欢
          • 2013-05-02
          • 1970-01-01
          • 2011-05-12
          • 2012-12-02
          • 1970-01-01
          • 1970-01-01
          • 2011-12-05
          • 1970-01-01
          相关资源
          最近更新 更多