Spring Data JPA禁用Native Query能否完全避免SQL注入风险?
- 内容介绍
- 文章标签
- 相关推荐
本文共计938个文字,预计阅读时间需要4分钟。
禁用不可信的 Native Query 是最有效的防线,因为 @Query(nativeQuery=true) 本身就免不了 SQL 注入——它只是把 SQL 交给了 JDBC PreparedStatement,但前提是 SQL 字符串里没有混入用户输入。
nativeQuery 为什么看起来“安全”实则危险
很多人误以为加了 nativeQuery = true 就自动防注入,其实它只保证命名参数(如 :name)走预编译绑定,但整个 SQL 字符串仍由开发者拼出来。一旦你在字符串里拼接用户输入,比如 "SELECT * FROM " + tableName + " WHERE id = :id",JPA 根本不拦你,PreparedStatement 也救不了——因为表名根本不是参数上下文。
本文共计938个文字,预计阅读时间需要4分钟。
禁用不可信的 Native Query 是最有效的防线,因为 @Query(nativeQuery=true) 本身就免不了 SQL 注入——它只是把 SQL 交给了 JDBC PreparedStatement,但前提是 SQL 字符串里没有混入用户输入。
nativeQuery 为什么看起来“安全”实则危险
很多人误以为加了 nativeQuery = true 就自动防注入,其实它只保证命名参数(如 :name)走预编译绑定,但整个 SQL 字符串仍由开发者拼出来。一旦你在字符串里拼接用户输入,比如 "SELECT * FROM " + tableName + " WHERE id = :id",JPA 根本不拦你,PreparedStatement 也救不了——因为表名根本不是参数上下文。

