使用过滤器解决前端XSS安全问题,JS注入问题
使用过滤器解决前端 XSS 安全问题
问题背景
在Java web 项目中,对于前端 JS 注入问题,可以在前端写 JS 代码进行预处理,但是这样处理无法保证万无一失,当用户篡改前端校验的 JS 代码,导致校验失效,如果服务端未经过任何处理,依然会出现 JS 安全问题,所以,对于 XSS 漏洞的防范,更优的解决方案是在服务端进行处理。
服务端进行处理的好处是显而易见的,首先安全性会更高,同时,前端所有可能存在 XSS 漏洞的地方不必再进行单独处理,统一在后台进行处理,大大提升了开发效率。
实际开发中,我们可以使用过滤器(Filter)处理。
解决思路
在用户请求抵达后端接口前,通过过滤器对其进行拦截,在过滤器中可以将用户请求类型(ServletRequest)改变成我们指定的类型,并在我们指定的类型中重写相应的方法,在方法中对参数中敏感字符进行转义,同时,为了在页面上正常显示,可以在前端对内容进行 HTML 反转义处理。
这里就要说到我们需要重写哪些方法了。
在项目的实际开发过程中,接口入参可能不是统一格式,最常见的有 @RequestParam 和 @ReqesutBody 两种类型,这两种类型的处理方式不同。
@RequetParam 是通过 getParameterValues() /getParameter() 方法来获取参数的,所以重写这两个方法即可。@RequestBody 是通过流来获取参数,所以需要重写的方法是 getInputStream()。
过滤器
过滤器可以对目标 web 资源的请求和响应进行拦截,并做一些特定处理。拦截路径支持自定义。实际开发过程中,我们可以指定拦截路径或者拦截白名单,根据项目的实际情况进行选择即可,差别不大。
为了简单明了,我们在此使用全路径拦截。当然,可以增加 xss 拦截器开关。
第一步,首先需要创建一个拦截器,所有的拦截器都需要实现 Filter 接口,我们的 XssFilter 也不例外。文件名:XssFilter
@Component
public class XssFilt