使用 NamedParameterJdbcTemplate 是否可以防止 SQL 注入?

Does using NamedParameterJdbcTemplate prevent SQL injection?

我有以下方法使用 NamedParameterJdbcTemplate 在 Spring 引导中执行 SQL 查询:

@Service
class MyRepository(
  val jdbcTemplate: NamedParameterJdbcTemplate
) {
  fun loadData(myKey: List<Int>): List<MyRow> {

    return jdbcTemplate.query(
      """
                select
                    io.KEY as itemKey,
                    art.ARTICLE_NR as articleNumber,
                    art.PRICE as price,   
                    concat(
                      concat(
                        concat(art.BEST_B, BEST_A), 
                          lpad(BEST_B, 2, '0')), 
                            lpad(BEST_A, 2, '0')) as group
                from
                    BUY.OPTION io
                    INNER JOIN BUYING.ART art ON (to_char(art.id) = io.keyb)
                where
                    io.KEY IN (:MYKEY)
      """.trimIndent(),
      parameters
    ) { rs, rowNum ->
      MyRow(
        itemOption = ItemOption(rs.getString("ITEMOPTION")),
        articleNumber = rs.getString("ARTICLENUMBER"),
        price = rs.getBigDecimal("PRICE")
        group = rs.getString("GROUP")
      )
    }
  }
}

由于此方法使用的是 NamedParameterJdbcTemplate,是否已防止 SQL 注入?或者我必须为此做一些额外的步骤吗?

NamedParameterJdbcTemplate 中使用参数将使用 JDBC 带参数的准备语句,这通常会保护您免受 SQL 注入。

我说的是“一般”,因为实际保护取决于所使用的特定 JDBC 驱动程序的实现。主流 JDBC 驱动程序将 - 阻止任何错误 - 保护您免受 SQL 注入,因为它们要么将语句和参数值分开(语句是用参数占位符准备的,并且在执行时只发送值),或者在生成实际查询时以其他方式正确转义(即 MySQL Connector/J 驱动程序中的默认行为)。然而,没有什么能阻止某人编写一个天真的 JDBC 驱动程序,该驱动程序将使用字符串插值来生成查询,而不会真正阻止 SQL 注入。