
之前有小伙伴表示,看 Spring Security 这么麻烦,不如自己写一个 Filter 拦截请求,简单实用。
自己写当然也可以实现,但是大部分情况下,大家都不是专业的 Web 安全工程师,所以考虑问题也不过就是认证和授权,这两个问题处理好了,似乎系统就很安全了。
其实不是这样的!
各种各样的 Web 攻击每天都在发生,什么固定会话攻击、csrf 攻击等等,如果不了解这些攻击,那么做出来的系统肯定也不能防御这些攻击。
使用 Spring Security 的好处就是,即使不了解这些攻击,也不用担心这些攻击,因为 Spring Security 已经帮你做好防御工作了。
我们常说相比于 Shiro,Spring Security 更加重量级,重量级有重量级的好处,比如功能全,安全管理更加完备。用了 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 Set<String> allowedHttpMethods = createDefaultAllowedHttpMethods();
-
private static Set<String> createDefaultAllowedHttpMethods() {
-
Set<String> 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(true);
-
return firewall;
-
}
其中,setUnsafeAllowAnyHttpMethod 方法表示不做 HTTP 请求方法校验,也就是什么方法都可以过。或者也可以通过 setAllowedHttpMethods 方法来重新定义可以通过的方法。
(编辑:开发网_开封站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|