SpringSecurity系列之请求默认已开启防火墙的示例分析

介绍

这篇文章给大家介绍SpringSecurity系列之请求默认已开启防火墙的示例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

自己写当然也可以实现,但是大部分情况下,大家都不是专业的Web,安全工程师,所以考虑问题也不过就是认证和授权,这两个问题处理好了,似乎系统就很安全了。

其实不是这样的!

各种各样的Web攻击每天都在发生,什么固定会话攻击,csrf攻击等等,如果不了解这些攻击,那么做出来的系统肯定也不能防御这些攻击。

使用Spring Security的好处就是,即使不了解这些攻击,也不用担心这些攻击,因为Spring Security,已经帮你做好防御工作了。

我们常说相比于Shiro, Spring Security更加重量级,重量级有重量级的好处,比如功能全,安全管理更加完备。用了春天,安全,你都不知道自己的系统有多安全!

今天我就来和大家聊一聊Spring Security中自带的防火墙机制。

好了,不废话了,我们来看文章,

1。HttpFirewall

在Spring Security中提供了一个HttpFirewall,看名字就知道这是一个请求防火墙,它可以自动处理掉一些非法请求。

HttpFirewall目前一共有两个实现类:

 SpringSecurity系列之请求默认已开启防火墙的示例分析

一个是严格模式的防火墙设置,还有一个默认防火墙设置。

DefaultHttpFirewall的限制相对于StrictHttpFirewall要宽松一些,当然也意味着安全性不如,StrictHttpFirewall。

Spring Security中默认使用的是StrictHttpFirewall。

2。防护措施

那么 StrictHttpFirewall 都是从哪些方面来保护我们的应用呢?我们来挨个看下。

2.1 只允许白名单中的方法

首先,对于请求的方法,只允许白名单中的方法,也就是说,不是所有的 HTTP 请求方法都可以执行。

这点我们可以从 StrictHttpFirewall 的源码中看出来:

public class StrictHttpFirewall implements HttpFirewall {  private Set allowedHttpMethods = 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,请求地址是不能有;的,如果请求地址有;,就会自动跳转到如下页面:

 SpringSecurity系列之请求默认已开启防火墙的示例分析

SpringSecurity系列之请求默认已开启防火墙的示例分析