在 Java 中将预准备语句和变量绑定 Order By 与 JDBC 驱动程序结合使用

2022-09-01 21:00:00

我正在使用

  1. jdbcTemplate,用于与 mySQL DB 建立 JDBC 连接
  2. 准备好语句,以尽可能保护自己免受SQL注入攻击
  3. 需要接受来自用户的请求,以对十几个不同列中的任何一个列上的数据进行排序
  4. 以下语句

    jdbcTemplate.query("SELECT * FROM TABLE1 ORDER BY ? ?", colName, sortOrder);
    

当然,这不起作用,因为变量绑定不应该指定列名,而应该指定查询中表达式的参数值。

所以。。。人们如何解决这个问题?只需在Java代码中进行排序似乎是一个简单的解决方案,但是由于我得到了一个变量字符串供列排序,并且一个变量告诉我排序顺序.这是一个丑陋的比较条件覆盖。这似乎应该是一个常见的问题,用一个共同的模式来解决它......


答案 1

占位符只能用于参数值,而不能用于列和排序顺序方向。因此,执行此操作的标准方法是使用String#format()或类似的东西将列名和顺序值附加到查询中。?

另一种选择是使用Spring Data JPA,您可以在其中为您的方法提供一个Sort类型的实例作为参数,该实例可以包含数据库排序所需的所有信息。


答案 2

我只是将列名和顺序与SQL查询连接起来,但只能在之后

  1. 验证列名和顺序在此上下文中是否有效。
  2. 清理它们以对抗SQL注入攻击的任何尝试。

我觉得与将结果提取到应用程序层并在此处进行排序相比,这是有效的。


推荐