首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止JPQL查询sql注入

问防止JPQL查询sql注入
EN

Stack Overflow用户
提问于 2019-03-08 07:42:49
回答 2查看 1.6K关注 0票数 2

我被告知,下面的查询作为参数是不安全的:从前端的输入字段搜索可以用于SQL注入。请建议在以下代码中防止SQL注入的最佳解决方案是什么?

代码语言:javascript
复制
@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)。不确定这是否还不安全。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-08 09:20:49

我被告知以下查询作为参数是不安全的:searchFor

你应该质疑这个建议。

当客户端传递的参数值可能传递额外的查询逻辑(通常是不需要的)并且在执行的查询中允许这样做时,就会发生SQL注入,例如。

例如,参数值可以包含查询中的附加逻辑,而不是用于searchFor的简单searchFor文本值,例如:foo OR ''=''。这就是SQL注入。

在您的例子中,Spring是不可能的,因为您没有手动设置参数,而是依赖一种安全的方法来绑定searchFor参数:Spring。

实际上,Spring与JPA实现一样以一种安全的方式绑定参数值,即设置来自JPA查询实例的参数值,该查询实例对声明的参数进行SQL注入保护。

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

代码语言:javascript
复制
"SELECT u FROM User u WHERE lower(u.username) LIKE :searchFor"

并尝试使用字符串searchFor设置"foo OR ''==''"的param,以尝试注入始终为真的SQL条件。

如果打开JPA实现的日志以输出参数绑定(对于Hibernate:logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE),您可以看到如下内容:

跟踪11012 - nio-8080-exec-8 o.h.type.descriptor.sql.BasicBinder :绑定参数1为VARCHAR或‘=’‘

绑定是仅为参数值执行的,而不是添加新查询逻辑的方法。保护的最后查询部分是这样保护的:

代码语言:javascript
复制
SELECT u FROM User u WHERE lower(u.username) LIKE "foo OR ''==''"
票数 6
EN

Stack Overflow用户

发布于 2019-03-08 08:27:07

我相信,如果以这种方式将输入作为参数传递,底层ORM框架将对输入进行清理。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55058760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档