温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-10-20 18:18:40 来源:亿速云 阅读:205 作者:柒染 栏目:大数据

本篇文章为大家展示了网关防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实践)

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

                                                图-HttpMessageConverter转换示意图

@Override
protected 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<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过滤器的设计是什么,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

xxs
AI