千家信息网

网关防XSS过滤器的设计是什么

发表于:2024-09-23 作者:千家信息网编辑
千家信息网最后更新 2024年09月23日,本篇文章为大家展示了网关防XSS过滤器的设计是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1. 如何防止XSS攻击?XSS的防御基本上,不外乎加强对使用
千家信息网最后更新 2024年09月23日网关防XSS过滤器的设计是什么

本篇文章为大家展示了网关防XSS过滤器的设计是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

1. 如何防止XSS攻击?

XSS的防御基本上,不外乎加强对使用者输入的验证,以及在输出时对内容进行转译。XSS问题需要多种方案的配合使用:

  • 前端做表单数据合法性校验(这是第一层防护,虽然"防君子不防小人",但必须要有)

  • 后端做数据过滤与替换(总有一些人会通过工具录入一些非法数据造访你的服务器的)

  • 持久层数据编码规范,比如使用Mybatis,看Mybatis中"$"和"#"千万不要乱用了解这些小细节

1.1 Spring AOP

使用Spring AOP横切所有API入口,貌似可以很轻松的实现,但是RESTful API设计并不是统一的入参格式,有GET请求的RequestParam的入参,也有POST请求RequestBody的入参,不同的入参很难进行统一处理,所以这并不是很好的方式,关于RESTful接口的设计,可以参考如何设计好的RESTfulAPI?

1.2 HttpMessageConverter

请求的JSON数据都要过HttpMessageConverter进行转换,通常我们可以通过添加MappingJackson2HttpMessageConverter并重写readInternal方法,将jackson的序列化和反序列化过程修改,加入过滤xss代码,并将其注册到MappingJackson2HttpMessageConverter中,那么就能解决json请求的xss问题,但这种方式只能过滤两种请求的参数:Content-Type为form表单(application/x-www-form-urlencoded)和 json(application/json),而没有办法处理GET请求,所以也不是一个很好的方案。(具体做法可以参考github.com/yangc91-SpringMvc防御XSS实践)

图-HttpMessageConverter转换示意图

@Overrideprotected Object readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {    return super.readInternal(clazz, inputMessage);}

1.3 装饰器模式Decorator结合ESAPI

还有一个问题是调用request.getInputStream()读取流,只能读取一次,调用责任链后续filter会导致request.getInputStream()内容为空,即便这是Filter责任链中的最后一个filter,程序运行到HttpMessageConverter时也会抛出异常,因此需要通过装饰器完成流的多次读取

ESAPI是一个免费、开源的Web应用程序安全控制组件,在Java Web应用中可帮助开发人员降低应用的风险。ESAPI是OWASP组织的一个开源项目,主页是:http://www.owasp.org/index.php/ESAPI。借助ESAPI可以很方便地替换和过滤掉非法参数,同时防止SQL注入。

2. 如何实现对请求参数的修改过滤

对所有后台请求使用filter过滤,在filter中将request中有隐患的关键字过滤掉,由于request中值不能直接修改,所以对request使用装饰器模式(Decorator)

在过滤器中对ServerWebExchange进行装饰,ServerWebExchange命名为服务网络交换器,存放着重要的请求-响应属性、请求实例和响应实例等等,有点像Context的角色。具体的过滤器设计如下:

public class ServerWebExchangeModifyFilter implements WebFilter {        @Override        public Mono filter(final ServerWebExchange exchange, final WebFilterChain chain) {                // throw UnsupportedOperationException, 安全考虑                // request.getHeaders().add("x", "1");                ServerWebExchangeDecorator decorator = new XssServerWebExchangeDecorator(exchange);                return chain.filter(decorator);        }}

ServerWebExchange装饰器为:

public class XssServerWebExchangeDecorator extends ServerWebExchangeDecorator {        private final ServerHttpRequestDecorator requestDecorator;        public XssServerWebExchangeDecorator(ServerWebExchange delegate) {                super(delegate);                this.requestDecorator = new XssServerHttpRequestDecorator(delegate.getRequest());        }        @Override        public ServerHttpRequest getRequest() {                return this.requestDecorator;        }}

请求装饰器如下:

public class XssServerHttpRequestDecorator extends ServerHttpRequestDecorator {        private final static HtmlFilter HTML_FILTER = new HtmlFilter();        private MultiValueMap queryParams;        private HttpHeaders headers;        public XssServerHttpRequestDecorator(ServerHttpRequest delegate) {                super(delegate);                this.queryParams = new HttpHeaders();                this.queryParams.addAll(filterQueryParams(delegate.getQueryParams()));                this.headers = new HttpHeaders();                this.headers.addAll(filterHttpHeaders(delegate.getHeaders()));        }        @Override        public MultiValueMap getQueryParams() {                return this.queryParams;        }        @Override        public HttpHeaders getHeaders() {                return this.headers;        }        private MultiValueMap filterQueryParams(MultiValueMap queryParams) {                // ...自定义过滤逻辑                return encodeQueryParams;        }        private MultiValueMap filterHttpHeaders(HttpHeaders httpHeaders) {                // ...自定义过滤逻辑                return encodeHttpHeaders;        }}


上述内容就是网关防XSS过滤器的设计是什么,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

0