防止 JPQL 查询 sql 注入
Prevent JPQL query sql injection
我被告知以下查询不安全,因为来自前端输入字段的参数 :searchFor 可用于 SQL 注入。
请告知在下面的代码中防止 SQL 注入的最佳解决方案是什么?
@Query("SELECT u FROM User u WHERE lower(u.username) LIKE %:searchFor% " +
" OR lower(concat(u.firstname, ' ', u.lastname)) LIKE %:searchFor% " +
" OR lower(u.email) LIKE %:searchFor%")
Page<User> findAllAndSearch(@Param(value = "searchFor") String searchFor, Pageable pageable);
我没有使用“+”连接字符串,而是提供了参数 (:searchFor)。不确定这是否仍然不安全。
我相信如果以这种方式作为参数传递,底层 ORM 框架会净化输入。
I was advised that below query is not safe as parameter :searchFor
你应该挑战这个建议。
SQL 当客户端传递的参数值可能传输额外的查询逻辑(通常不需要)并且在执行的查询中允许这样时,就会发生注入,例如。
例如,代替 searchFor
的简单 foo
文本值,参数值还可以在查询中包含其他逻辑,例如:foo OR ''=''
。即SQL注入。
在你的情况下,SQL 注入是不可能的,因为你没有手动设置参数,而是依赖于一种安全的方式来绑定 searchFor
参数:Spring .
实际上,Spring 以一种安全的方式绑定参数值,就像 JPA 实现所做的那样,即从 JPA Query 实例设置参数值,该实例可防止对声明的参数进行 SQL 注入。
例如以这个查询为例(我删除了 %
部分以简化):
"SELECT u FROM User u WHERE lower(u.username) LIKE :searchFor"
并尝试使用字符串 "foo OR ''==''"
设置 searchFor
的参数,以尝试注入一个始终为真的 SQL 条件。
如果您打开 JPA 实现的日志以输出参数绑定(对于 Hibernate:logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
),您可能会看到如下内容:
TRACE 11012 --- [nio-8080-exec-8] o.h.type.descriptor.sql.BasicBinder
: binding parameter [1] as [VARCHAR] - [foo OR ''=='']
绑定仅 对参数值执行,而不是作为添加新查询逻辑的方式。受保护的最终查询部分受保护为:
SELECT u FROM User u WHERE lower(u.username) LIKE "foo OR ''==''"
我被告知以下查询不安全,因为来自前端输入字段的参数 :searchFor 可用于 SQL 注入。 请告知在下面的代码中防止 SQL 注入的最佳解决方案是什么?
@Query("SELECT u FROM User u WHERE lower(u.username) LIKE %:searchFor% " +
" OR lower(concat(u.firstname, ' ', u.lastname)) LIKE %:searchFor% " +
" OR lower(u.email) LIKE %:searchFor%")
Page<User> findAllAndSearch(@Param(value = "searchFor") String searchFor, Pageable pageable);
我没有使用“+”连接字符串,而是提供了参数 (:searchFor)。不确定这是否仍然不安全。
我相信如果以这种方式作为参数传递,底层 ORM 框架会净化输入。
I was advised that below query is not safe as parameter :searchFor
你应该挑战这个建议。
SQL 当客户端传递的参数值可能传输额外的查询逻辑(通常不需要)并且在执行的查询中允许这样时,就会发生注入,例如。
例如,代替 searchFor
的简单 foo
文本值,参数值还可以在查询中包含其他逻辑,例如:foo OR ''=''
。即SQL注入。
在你的情况下,SQL 注入是不可能的,因为你没有手动设置参数,而是依赖于一种安全的方式来绑定 searchFor
参数:Spring .
实际上,Spring 以一种安全的方式绑定参数值,就像 JPA 实现所做的那样,即从 JPA Query 实例设置参数值,该实例可防止对声明的参数进行 SQL 注入。
例如以这个查询为例(我删除了 %
部分以简化):
"SELECT u FROM User u WHERE lower(u.username) LIKE :searchFor"
并尝试使用字符串 "foo OR ''==''"
设置 searchFor
的参数,以尝试注入一个始终为真的 SQL 条件。
如果您打开 JPA 实现的日志以输出参数绑定(对于 Hibernate:logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
),您可能会看到如下内容:
TRACE 11012 --- [nio-8080-exec-8] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [VARCHAR] - [foo OR ''=='']
绑定仅 对参数值执行,而不是作为添加新查询逻辑的方式。受保护的最终查询部分受保护为:
SELECT u FROM User u WHERE lower(u.username) LIKE "foo OR ''==''"