这篇文章给大家介绍SpringSecurity系列之请求默认已开启防火墙的示例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
自己写当然也可以实现,但是大部分情况下,大家都不是专业的Web,安全工程师,所以考虑问题也不过就是认证和授权,这两个问题处理好了,似乎系统就很安全了。
其实不是这样的!
各种各样的Web攻击每天都在发生,什么固定会话攻击,csrf攻击等等,如果不了解这些攻击,那么做出来的系统肯定也不能防御这些攻击。
使用Spring Security的好处就是,即使不了解这些攻击,也不用担心这些攻击,因为Spring Security,已经帮你做好防御工作了。
我们常说相比于Shiro, Spring Security更加重量级,重量级有重量级的好处,比如功能全,安全管理更加完备。用了春天,安全,你都不知道自己的系统有多安全!
今天我就来和大家聊一聊Spring Security中自带的防火墙机制。
好了,不废话了,我们来看文章,
1。HttpFirewall
在Spring Security中提供了一个HttpFirewall,看名字就知道这是一个请求防火墙,它可以自动处理掉一些非法请求。
HttpFirewall目前一共有两个实现类:
一个是严格模式的防火墙设置,还有一个默认防火墙设置。
DefaultHttpFirewall的限制相对于StrictHttpFirewall要宽松一些,当然也意味着安全性不如,StrictHttpFirewall。
Spring Security中默认使用的是StrictHttpFirewall。
2。防护措施
那么 StrictHttpFirewall 都是从哪些方面来保护我们的应用呢?我们来挨个看下。
2.1 只允许白名单中的方法
首先,对于请求的方法,只允许白名单中的方法,也就是说,不是所有的 HTTP 请求方法都可以执行。
这点我们可以从 StrictHttpFirewall 的源码中看出来:
public class StrictHttpFirewall implements HttpFirewall { private SetallowedHttpMethods = createDefaultAllowedHttpMethods(); private static Set createDefaultAllowedHttpMethods() { Set result = new HashSet<>(); result.add(HttpMethod.DELETE.name()); result.add(HttpMethod.GET.name()); result.add(HttpMethod.HEAD.name()); result.add(HttpMethod.OPTIONS.name()); result.add(HttpMethod.PATCH.name()); result.add(HttpMethod.POST.name()); result.add(HttpMethod.PUT.name()); return result; } private void rejectForbiddenHttpMethod(HttpServletRequest request) { if (this.allowedHttpMethods == ALLOW_ANY_HTTP_METHOD) { return; } if (!this.allowedHttpMethods.contains(request.getMethod())) { throw new RequestRejectedException("The request was rejected because the HTTP method "" + request.getMethod() + "" was not included within the whitelist " + this.allowedHttpMethods); } } }
从这段代码中我们看出来,你的 HTTP 请求方法必须是 DELETE、GET、HEAD、OPTIONS、PATCH、POST 以及 PUT 中的一个,请求才能发送成功,否则的话,就会抛出 RequestRejectedException 异常。
那如果你想发送其他 HTTP 请求方法,例如 TRACE ,该怎么办呢?我们只需要自己重新提供一个StrictHttpFirewall,实例即可,如下:
@Bean HttpFirewall httpFirewall (), {,,,, StrictHttpFirewall firewall =, new StrictHttpFirewall (),,,,,, firewall.setUnsafeAllowAnyHttpMethod(真正的),,,,,,return 防火墙;,}
其中,setUnsafeAllowAnyHttpMethod方法表示不做HTTP请求方法校验,也就是什么方法都可以过。或者也可以通过,setAllowedHttpMethods方法来重新定义可以通过的方法。
<强> 2.2请求地址不能有分号强>
不知掉大家有没有试过,如果你使用了Spring Security,请求地址是不能有;的,如果请求地址有;,就会自动跳转到如下页面: