使用 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 注入。
我有以下方法使用 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 注入。