And*_*kas 2 jpa sql-injection jpql spring-boot
我被告知以下查询是不安全的,因为来自前端输入字段的参数: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);
Run Code Online (Sandbox Code Playgroud)
我没有使用“+”来连接字符串,而是提供参数(:searchFor)。不确定这是否仍然不安全。
我被告知以下查询作为参数不安全:searchFor
你应该挑战这个建议。
SQL 注入发生在客户端传递的参数值可能传输额外的查询逻辑(通常不受欢迎)并且在执行的查询中允许的情况下,例如。
例如,代替 的简单foo文本值 searchFor,参数值还可以包含查询中的附加逻辑,例如:foo OR ''=''。那就是SQL注入。
在您的情况下,SQL 注入是不可能的,因为您没有手动设置参数,而是依靠一种安全的方式来绑定searchFor参数:Spring。
事实上,Spring 以一种安全的方式绑定参数值,就像 JPA 实现一样,即从 JPA 查询实例设置参数值,该实例保护声明参数免受 SQL 注入。
以这个查询为例(我删除了%部分以简化):
"SELECT u FROM User u WHERE lower(u.username) LIKE :searchFor"
Run Code Online (Sandbox Code Playgroud)
并尝试searchFor使用 String设置 param"foo OR ''==''"以尝试注入始终为真的 SQL 条件。
如果您打开 JPA 实现的日志以输出参数绑定(对于 Hibernate :),logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE您可以看到如下内容:
TRACE 11012 --- [nio-8080-exec-8] ohtype.descriptor.sql.BasicBinder :将参数 [1] 绑定为 [VARCHAR] - [foo OR ''=='']
绑定 仅针对参数值执行,而不是作为添加新查询逻辑的一种方式。受保护的最终查询部分如此受保护:
SELECT u FROM User u WHERE lower(u.username) LIKE "foo OR ''==''"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
880 次 |
| 最近记录: |