【发布时间】:2015-03-18 23:57:09
【问题描述】:
对于 Spring,传递给 @Query 注释的字符串参数是否会像使用 PreparedStatement 类或任何旨在防止 SQL 注入的方法时一样被视为纯数据?
final String MY_QUERY = "SELECT * FROM some_table WHERE some_column = ?1";
@Query(value=MY_QUERY, nativeQuery = true)
List<SomeEntity> findResults(String potentiallyMaliciousUserInput);
底线:上面的代码是否容易受到 SQL 注入的影响?
【问题讨论】:
-
MY_QUERY 不能是静态的吗?
-
@tkr 是的,我相信是的。我在尝试动态构建查询组件以输入 Query 时遇到了问题。我相信只有参数是您可以更改的。
-
我实际上认为这是设计使然。这鼓励您不要使用字符串连接来构建 SQL,而是使用适当的准备好的语句参数。 (但我不太确定。)
-
@tkr 这也是我的猜测。它还可能与查询在运行时转换为 sql 语句的方式有关。我相信这种转换发生在 Spring bean 初始化时,这也是在您自己的代码实际执行之前。或者换一种说法,你的查询必须在 bean 初始化时间前准备好,减去准备好的参数。
-
我查过了。 MY_QUERY 不能是静态的,而是最终的。
标签: java spring sql-injection spring-annotations