我被告知,下面的查询作为参数是不安全的:从前端的输入字段搜索可以用于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)。不确定这是否还不安全。
发布于 2019-03-08 09:20:49
我被告知以下查询作为参数是不安全的:searchFor
你应该质疑这个建议。
当客户端传递的参数值可能传递额外的查询逻辑(通常是不需要的)并且在执行的查询中允许这样做时,就会发生SQL注入,例如。
例如,参数值可以包含查询中的附加逻辑,而不是用于searchFor的简单searchFor文本值,例如:foo OR ''=''。这就是SQL注入。
在您的例子中,Spring是不可能的,因为您没有手动设置参数,而是依赖一种安全的方法来绑定searchFor参数:Spring。
实际上,Spring与JPA实现一样以一种安全的方式绑定参数值,即设置来自JPA查询实例的参数值,该查询实例对声明的参数进行SQL注入保护。
例如,以这个查询为例(为了简化,我删除了%部件):
"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或‘=’‘
绑定是仅为参数值执行的,而不是添加新查询逻辑的方法。保护的最后查询部分是这样保护的:
SELECT u FROM User u WHERE lower(u.username) LIKE "foo OR ''==''"发布于 2019-03-08 08:27:07
我相信,如果以这种方式将输入作为参数传递,底层ORM框架将对输入进行清理。
https://stackoverflow.com/questions/55058760
复制相似问题