【问题标题】:Does using NamedParameterJdbcTemplate prevent SQL injection?使用 NamedParameterJdbcTemplate 会阻止 SQL 注入吗?
【发布时间】:2022-10-20 15:22:50
【问题描述】:

我有以下方法使用NamedParameterJdbcTemplate 在 Spring Boot 中执行 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 注入进行了保护?还是我必须为此做一些额外的步骤?

【问题讨论】:

    标签: sql spring kotlin jdbc spring-jdbc


    【解决方案1】:

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

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

    【讨论】:

    • 如果有人像我一样需要进一步的文档,这里是来自Spring docs 的链接
    • @JeppeGravgaard 好点,我在答案中添加了指向“当前”文档的链接。
    猜你喜欢
    • 2018-09-14
    • 1970-01-01
    • 2018-03-29
    • 2017-11-06
    • 2021-03-21
    • 2013-05-05
    • 2015-03-20
    • 2011-12-27
    • 2017-07-11
    相关资源
    最近更新 更多