1、说明
参照文章《重写RequestMappingHandlerMapping,注册@RequestMapping无值时的路径》,在此文章的基础上,对路径映射过程中的方法进行过滤,禁止trace请求
2、目的
禁用trace请求的原因是,如果运行trace请求,可能会让自己的系统遭受XST(跨站追踪攻击 cross-site trace)攻击。XST攻击的原理是,利用trace请求会返回请求头的详细的特性,获取用户cookie,从而实现 XSS、CSRF等攻击。详细XST攻击的知识参考文章《前端 | XST 的攻击原理与防御》。
3、代码实现
在文章《重写RequestMappingHandlerMapping,注册@RequestMapping无值时的路径》的基础上,增加RequestMethond拦截岂可。这里只给出createRequestMappingInfo方法的部分代码,其他同上述文章。
private RequestMappingInfo createRequestMappingInfo(RequestMapping requestMapping,
RequestCondition<?> customCondition,Class<?> handlerType, Method method) {
//注解空的情况
if(requestMapping==null){
return null;
}
//过滤trace请求
RequestMethod[] requestMethods = {RequestMethod.GET,RequestMethod.POST,RequestMethod.HEAD,
RequestMethod.DELETE,RequestMethod.OPTIONS,RequestMethod.PATCH,RequestMethod.PUT};
if(requestMapping.method().length!=0){
requestMethods = requestMapping.method();
}
//这里省略部分代码.......
return RequestMappingInfo
.paths(resolveEmbeddedValuesInPatterns(patterns))
.methods(requestMethods)
.params(requestMapping.params())
.headers(requestMapping.headers())
.consumes(requestMapping.consumes())
.produces(requestMapping.produces())
.mappingName(requestMapping.name())
.customCondition(customCondition)
.build();
}
4、验证
查看启动日志,效果图如下:
结果图
说明:postman无法发送trace请求,所以可以使用telnet或者js脚本发送
下面给出js脚本的代码
<html>
<head>
testTrace
</head>
<body>
body
</body>
<script type = "text/javaScript">
var httpRequest = new XMLHttpRequest();
httpRequest.open('TRACE', 'http://127.0.0.1:12316/test88888/test77777', true);
httpRequest.setRequestHeader("Content-type","application/x-www-form-urlencoded");
httpRequest.send('');
httpRequest.onreadystatechange = function () {
if (httpRequest.readyState == 4 && httpRequest.status == 200) {
var json = httpRequest.responseText;
console.log(json);
}
console.log(httpRequest.readState);
};
</script>
</html/>
参考文章
1、https://blog.csdn.net/he_qiao/article/details/92968613
2、https://zhuanlan.zhihu.com/p/61990354
网友评论