美文网首页
重写RequestMappingHandlerMapping,禁

重写RequestMappingHandlerMapping,禁

作者: chanyi | 来源:发表于2020-06-09 12:03 被阅读0次

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

相关文章

网友评论

      本文标题:重写RequestMappingHandlerMapping,禁

      本文链接:https://www.haomeiwen.com/subject/ovdstktx.html