本篇文章为大家展示了网关防XSS过滤器的设计是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
XSS的防御基本上,不外乎加强对使用者输入的验证,以及在输出时对内容进行转译。XSS问题需要多种方案的配合使用:
前端做表单数据合法性校验(这是第一层防护,虽然“防君子不防小人”,但必须要有)
后端做数据过滤与替换(总有一些人会通过工具录入一些非法数据造访你的服务器的)
持久层数据编码规范,比如使用Mybatis,看Mybatis中“$"和"#"千万不要乱用了解这些小细节
使用Spring AOP横切所有API入口,貌似可以很轻松的实现,但是RESTful API设计并不是统一的入参格式,有GET请求的RequestParam的入参,也有POST请求RequestBody的入参,不同的入参很难进行统一处理,所以这并不是很好的方式,关于RESTful接口的设计,可以参考如何设计好的RESTfulAPI?
请求的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转换示意图
@Override protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { return super.readInternal(clazz, inputMessage); }
还有一个问题是调用request.getInputStream()读取流,只能读取一次,调用责任链后续filter会导致request.getInputStream()内容为空,即便这是Filter责任链中的最后一个filter,程序运行到HttpMessageConverter时也会抛出异常,因此需要通过装饰器完成流的多次读取。
ESAPI是一个免费、开源的Web应用程序安全控制组件,在Java Web应用中可帮助开发人员降低应用的风险。ESAPI是OWASP组织的一个开源项目,主页是:http://www.owasp.org/index.php/ESAPI。借助ESAPI可以很方便地替换和过滤掉非法参数,同时防止SQL注入。
对所有后台请求使用filter过滤,在filter中将request中有隐患的关键字过滤掉,由于request中值不能直接修改,所以对request使用装饰器模式(Decorator)
在过滤器中对ServerWebExchange进行装饰,ServerWebExchange命名为服务网络交换器,存放着重要的请求-响应属性、请求实例和响应实例等等,有点像Context的角色。具体的过滤器设计如下:
public class ServerWebExchangeModifyFilter implements WebFilter { @Override public Mono<Void> 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<String, String> 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<String, String> getQueryParams() { return this.queryParams; } @Override public HttpHeaders getHeaders() { return this.headers; } private MultiValueMap filterQueryParams(MultiValueMap<String, String> queryParams) { // ...自定义过滤逻辑 return encodeQueryParams; } private MultiValueMap filterHttpHeaders(HttpHeaders httpHeaders) { // ...自定义过滤逻辑 return encodeHttpHeaders; } }
上述内容就是网关防XSS过滤器的设计是什么,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。