详解spring security安全防护

  

  

xss攻击(跨站脚本攻击):攻击者在页面里插入恶意脚本代码,用户浏览该页面时,脚本代码就会执行,达到攻击者的目的。原理就是:攻击者对含有漏洞的服务器注入恶意代码,引诱用户浏览受到攻击的服务器,并打开相关页面,执行恶意代码。
  xss攻击方式:一,反射性攻击,脚本代码作为url参数提交给服务器,服务器解析执行后,将脚本代码返回给浏览器,最后浏览器解析执行攻击代码;二,存储性攻击,和发射性攻击的区别是,脚本代码存储在服务器,下次在请求时,不用再提交脚本代码。其中一个示例图如下所示:
  

  

详解spring security安全防护

  

CSRF攻击:跨站请求伪造攻击,CSRF是一种欺骗受害者提交恶意请求的攻击,并劫持受害者的身份和特权,并以受害者的身份访问未授权的信息和功能。序列图如下所示:
  

  

详解spring security安全防护

  

  

解决XSS攻击和CSRF攻击的一个推荐方法就是同步器令牌,就是在文章的请求中,增加一个令牌,每次请求到来,服务器都会验证请求中的令牌和服务器期望的值是否一致,如果不一致,服务器将请求视为非法的,整个过程的示例图如下所示:
  

  

详解spring security安全防护

  

在spring security中如果使用的是@EnableWebMvcSecurity而不是@EnableWebSecurity,同步器令牌是默认打开的,通过http () .csrf () .disable()可以关闭同步器标记功能.spring安全发现令牌无效后,会返回一个403年的访问拒绝,不过可以通过配置AccessDeniedHandler类处理InvalidCsrfTokenException异常来定制行为。

  

spring security虽然默认是打开同步器牌保护的,但是也提供了一个显示打开的行为即http () .csrf(),同时需要在html表的形式单中添加以" & lt;输入类型="隐藏" name=" $ {_csrf。parameterName}“价值=" https://www.yisu.com/zixun/$ {_csrf.token} "/祝辞”

  

如果请求的是json或ajax请求,如何使用同步器牌防护那?
  json请求的话,我们可以在头的元数据中添加牌防护,代码如下所示:

        & lt; head>   & lt;元name=癬csrf”内容=" $ {_csrf.token} "/比;   & lt; !——默认标题名称是X-CSRF-TOKEN祝辞   & lt;元name=癬csrf_header”内容=" $ {_csrf.headerName} "/比;   …   & lt;/head>      

ajax请求的话,可是使用如下代码:

        $(函数(){   var牌=$(“元[name=' _csrf ']”) .attr(“内容”);   头=$ var(“元[name=' _csrf_header ']”) .attr(“内容”);   美元(文档)。ajaxSend(函数(e, xhr、期权){   xhr。setRequestHeader(头,令牌);   });   });      

<强>同步令牌的常见问题
  

  

1。超时
  因为令牌是存储在httpsession中的,所以令牌存在超时的问题,一旦超时,则配置的accessDeniedHandler将接受一个异常,或者spring security直接拒绝访问。
  2.登录
  为了防止伪造的登录请求,在登录的形式中也需要添加令牌,而牌又是存储在HttpSession中,也就是说一旦发现令牌属性,就会创建一个HttpSession,这和无状态架构模式可能会产生一些冲突。
  3.注销
  添加CSRF将更新LogoutFilter过滤器,使其只使用HTTP POST。这确保了注销需要一个CSRF令牌,并且恶意用户不能强制注销您的用户。也就是说,注销不再是一个得到请求,而是一个帖子请求;

  

  

spring security支持的响应头包括:cache - control,内容类型选项,HTTP严格的运输安全,X-Frame-Options, X-XSS-Protection如果你使用的是WebSecurityConfigurerAdapter配置方式,则这些头都是默认支持的,你可以通过调用http.header () .disable()关闭这些缺省的头。当然你也可以单独配置,但是如果你单独配置的话,只有你配置的头会起作用,其他的头都不再默认支持了。下面分别来讨论一下这些响应头的含义。

  

<强> cache - control
  

  

如果不加任何控制,浏览器通常会缓存你的认证相关信息,这在一定程度上会造成你的信息泄露,因此在默认情况下,spring security会在响应头里加入缓存控制如下所示:

        cache - control: no - cache,不是商店,信息=0,must-revalidate   编译指示:no - cache   到期:0

详解spring security安全防护