gpt4 book ai didi

spring-boot - 防止JPQL查询sql注入(inject)

转载 作者:行者123 更新时间:2023-12-05 09:14:04 25 4
gpt4 key购买 nike

我被告知以下查询不安全,因为来自前端输入字段的参数 :searchFor 可用于 SQL 注入(inject)。请告知在以下代码中防止 SQL 注入(inject)的最佳解决方案是什么?

@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)。不确定这是否仍然不安全。

最佳答案

I was advised that below query is not safe as parameter :searchFor

你应该挑战这个建议。

当客户端传递的参数值可能传输额外的查询逻辑(通常不需要)并且在执行的查询中允许这样的查询时,就会发生 SQL 注入(inject),例如。
例如,代替 searchFor 的简单 foo 文本值,参数值还可以在查询中包含其他逻辑,例如:foo OR ''=' '。那就是SQL注入(inject)。

在您的情况下,SQL 注入(inject)是不可能的,因为您没有手动设置参数,而是依赖于一种安全的方式来绑定(bind) searchFor 参数:Spring。
事实上,Spring 以一种安全的方式绑定(bind)参数值,就像 JPA 实现所做的那样,即从 JPA 查询实例设置参数值,该实例可防止声明参数的 SQL 注入(inject)。

例如以这个查询为例(我删除了 % 部分以简化):

"SELECT u FROM User u WHERE lower(u.username) LIKE :searchFor"

并尝试使用字符串 "foo OR ''==''" 设置 searchFor 的参数,以尝试注入(inject)始终为真的 SQL 条件。
如果打开 JPA 实现的日志以输出参数绑定(bind)(对于 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 ''=='']

绑定(bind)为参数值执行,而不是作为添加新查询逻辑的方式。 protected 最终查询部分是这样保护的:

SELECT u FROM User u WHERE lower(u.username) LIKE "foo OR ''==''"

关于spring-boot - 防止JPQL查询sql注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55058760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com