Spring 过滤危险字符

项目中涉及到复杂查询,比如模糊查询。ORM框架往往不能很好处理,难免会遇到拼接字符串。而手动拼接的方式很容易让代码产生SQL注入漏洞。使用拦截器和过滤器,过滤请求中的危险字符,可以解决SQL注入攻击。

常用的请求有两种方式,一种是form表单提交,另一种是json格式。在Spring框架中处理这两种的方法也是有区别的。

过滤form表单

过滤表单提交的危险字符,使用的是过滤器,需要继承OncePerRequestFilter类。

在spring中,filter都默认继承OncePerRequestFilter。顾名思义,他能够确保在一次请求只通过一次filter,而不需要重复执行。

大家常识上都认为,一次请求本来就只过一次,为什么还要由此特别限定呢,实际上我们常识和实际的实现并不真的一样,经过一番查阅后,此方式是为了兼容不同的web container,特意而为之(jsr168),也就是说并不是所有的container都像我们期望的只过滤一次,servlet版本不同,表现也不同。

/**
* Filter base class that guarantees to be just executed once per request,
* on any servlet container. It provides a {@link #doFilterInternal}
* method with HttpServletRequest and HttpServletResponse arguments.
*
* <p>The {@link #getAlreadyFilteredAttributeName} method determines how
* to identify that a request is already filtered. The default implementation
* is based on the configured name of the concrete filter instance.
*
* @author Juergen Hoeller
* @since 06.12.2003
*/

如,servlet2.3与servlet2.4也有一定差异

在servlet-2.3中,Filter会过滤一切请求,包括服务器内部使用forward转发请求和<%@ include file="/index.jsp"%>的情况。
到了servlet-2.4中Filter默认下只拦截外部提交的请求,forward和include这些内部转发都不会被过滤,但是有时候我们需要 forward的时候也用到Filter。

因此,为了兼容各种不同的运行环境和版本,默认filter继承OncePerRequestFilter是一个比较稳妥的选择。

以下是我的过滤器代码:

使用时,只需在web.xml中配置即可。如果系统基于Spring Boot开发,则用@WebFilter注解配置过滤器。

过滤JSON内容

过滤JSON中的危险字符需要继承Spring JSON转换器,MappingJackson2HttpMessageConverter类。然后重写方法:

注意:Jackson是Spring默认的JSON解析器,如果系统改用了Gson等其他解析器,需要继承对应的类再重写。

使用时,在Spring MVC配置文件中加载。如图:

如果是基于Spring Boot开发,则继承WebMvcConfigurer接口,重写相应方法,加载即可。

源码:

参考:

https://ully.iteye.com/blog/1334925

https://my.oschina.net/u/2436852/blog/1542772

留下评论

电子邮件地址不会被公开。