Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 防止JPQL查询sql注入_Spring Boot_Jpa_Sql Injection_Jpql - Fatal编程技术网

Spring boot 防止JPQL查询sql注入

Spring boot 防止JPQL查询sql注入,spring-boot,jpa,sql-injection,jpql,Spring Boot,Jpa,Sql Injection,Jpql,我被告知以下查询作为参数是不安全的:来自前端输入字段的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.ema

我被告知以下查询作为参数是不安全的:来自前端输入字段的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框架将清理输入

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

你应该质疑这个建议

SQL注入发生在客户端传递的参数值可能传输额外的查询逻辑时,这些逻辑通常是不需要的,并且在执行的查询中是允许的,例如。 例如,参数值可以在查询中包含其他逻辑,例如:foo或=,而不是searchFor的简单foo文本值。这就是SQL注入

在您的情况下,SQL注入是不可能的,因为您没有手动设置参数,而是依赖于一种安全的方式来绑定search for参数:Spring。 事实上,Spring以一种安全的方式绑定参数值,就像JPA实现一样,即从JPA查询实例设置参数值,该实例针对声明参数的SQL注入受到保护

例如,以此查询为例,我删除了%部分以简化:

"SELECT u FROM User u WHERE lower(u.username) LIKE :searchFor"
并尝试使用字符串foo或==设置searchFor的参数,以尝试注入始终为true的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]-[foo或==]

绑定仅针对参数值执行,而不是作为添加新查询逻辑的方式。受保护的最终查询部分的保护方式如下:

SELECT u FROM User u WHERE lower(u.username) LIKE "foo OR ''==''"
可能重复的