摘要:发现无效后,会返回一个的访问拒绝,不过可以通过配置类处理异常来定制行为。恶意用户可能提交一个有效的文件,并使用它执行攻击。默认是禁止进行嗅探的。
前言
xss攻击(跨站脚本攻击):攻击者在页面里插入恶意脚本代码,用户浏览该页面时,脚本代码就会执行,达到攻击者的目的。原理就是:攻击者对含有漏洞的服务器注入恶意代码,引诱用户浏览受到攻击的服务器,并打开相关页面,执行恶意代码。
xss攻击方式:一、反射性攻击,脚本代码作为url参数提交给服务器,服务器解析执行后,将脚本代码返回给浏览器,最后浏览器解析执行攻击代码;二、存储性攻击,和发射性攻击的区别是,脚本代码存储在服务器,下次在请求时,不用再提交脚本代码。其中一个示例图如下所示:
CSRF攻击:跨站请求伪造攻击,CSRF是一种欺骗受害者提交恶意请求的攻击,并劫持受害者的身份和特权,并以受害者的身份访问未授权的信息和功能。序列图如下所示:
解决XSS攻击和CSRF攻击的一个推荐方法就是同步器Token,就是在post的请求中,增加一个token,每次请求到来,服务器都会验证请求中的token和服务器期望的值是否一致,如果不一致,服务器将请求视为非法的,整个过程的示例图如下所示:
在spring security中如果使用的是 @EnableWebMvcSecurity而不是@EnableWebSecurity,同步器Token是默认打开的,通过http().csrf().disable()可以关闭同步器token功能。spring security发现token无效后,会返回一个403的访问拒绝,不过可以通过配置AccessDeniedHandler类处理InvalidCsrfTokenException异常来定制行为。
spring security虽然默认是打开同步器token保护的,但是也提供了一个显示打开的行为即http().csrf(),同时需要在html的form表单中添加以“”
如果请求的是json或ajax请求,如何使用同步器token防护那?
json请求的话,我们可以在header的元数据中添加token防护,代码如下所示:
...
ajax请求的话,可是使用如下代码:
$(function () { var token = $("meta[name="_csrf"]").attr("content"); var header = $("meta[name="_csrf_header"]").attr("content"); $(document).ajaxSend(function(e, xhr, options) { xhr.setRequestHeader(header, token); }); });
Synchronizer Token的常见问题
1.超时
因为token是存储在httpsession中的,所以token存在超时的问题,一旦超时,则配置的accessDeniedHandler将接受一个异常,或者spring security直接拒绝访问;
2.登录
为了防止伪造的登录请求,在登录的form中也需要添加token,而token又是存储在HttpSession中,也就是说一旦发现token属性,就会创建一个HttpSession,这和无状态架构模式可能会产生一些冲突;
3.注销
添加CSRF将更新LogoutFilter过滤器,使其只使用HTTP POST。这确保了注销需要一个CSRF令牌,并且恶意用户不能强制注销您的用户。也就是说,注销不再是一个get请求,而是一个post请求;
spring security 支持的response header 包括:Cache-Control,Content-type options,HTTP Strict Transport Security,X-Frame-Options,X-XSS-Protection 如果你使用的是WebSecurityConfigurerAdapter 配置方式,则这些头都是默认支持的,你可以通过调用 http.header().disable()关闭这些缺省的头。当然你也可以多带带配置,但是如果你多带带配置的话,只有你配置的头会起作用,其他的头都不再默认支持了。下面分别来讨论一下这些响应header的含义;
Cache-Control
如果不加任何控制,浏览器通常会缓存你的认证相关信息,这在一定程度上会造成你的信息泄露,因此在默认情况下,spring security会在响应头里加入缓存控制如下所示:
Cache-Control: no-cache, no-store, max-age=0, must-revalidate Pragma: no-cache Expires: 0
当然你也可以通过 http.header().cacheControl()方法多带带打开缓存控制,你也可以通过HttpServletResponse.setHeader(String,String)方法对特殊的响应做处理,从而确保css js 图片能够合适地被缓存,在spring mvc中,可以通过配置进行设置,下面的代码对所有的资源都增加了缓存:
@EnableWebMvc public class WebMvcConfiguration extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers( ResourceHandlerRegistry registry) { registry .addResourceHandler("/resources/**") .addResourceLocations("/resources/") .setCachePeriod(3_155_6926); } // ... }
Content-type Options
历史上很多很多浏览器都能可以通过对请求类型的content进行嗅探,猜测请求类型,从而提高用户体验,但是这会带来XSS攻击。例如有些站点允许用户向其提交有效的postScript脚本,并查看他。恶意用户可能提交一个有效的js文件,并使用它执行XSS攻击。spring security默认是禁止进行嗅探的。
HTTP Strict Transport Security
当你访问一个站点是,例如www.baidu.com,省略了https协议,潜在的你会受到中间人攻击,为了减少这种情况,就是告知浏览器,当你输入某个地址时,应该使用https协议。如何让浏览器该host是一个hsts站点那?其中一种方法就是,增加Strict-Transport-Security 到响应头中,如下例所示:
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
上述例子告知浏览器,该站点在一年内访问都使用https协议,includeSubDomains说明该站点的子域名也使用https协议访问。
X-frame-optiont
X-Frame-Options HTTP 响应头是用来给浏览器指示允许一个页面可否在 ,
Customer HeaderSpring Security有一些机制,可以方便地向应用程序添加更常见的安全头。但是,它还提供了允许添加自定义头的钩子。有时,您希望将自定义安全头插入到您的应用程序中,而该特性并没有被支持。例如,您可能希望尽早支持内容安全策略,以确保资源只能从相同的源加载。由于对内容安全策略的支持还没有最终确定,浏览器使用两个常见的扩展头之一来实现这个特性。这意味着我们将需要注入两次策略。下面的代码片段中可以看到一个头的示例:
X-Content-Security-Policy: default-src "self" X-WebKit-CSP: default-src "self" @Override protected void configure(HttpSecurity http) throws Exception { http.headers() .addHeaderWriter( new StaticHeadersWriter( "X-Content-Security-Policy", "default-src "self"")) .addHeaderWriter( new StaticHeadersWriter( "X-WebKit-CSP", "default-src "self"")); }
当名称空间或Java配置不支持您想要的头部时,您可以创建一个自定义的HeadersWriter实例,甚至可以提供HeadersWriter的自定义实现。让我们看一个使用XFrameOptionsHeaderWriter的自定义实例的示例。也许您希望允许为相同的起源构建内容框架。将策略属性设置为SAMEORIGIN很容易支持这一点:
@Override protected void configure(HttpSecurity http) throws Exception { http.headers() .addHeaderWriter( new XFrameOptionsHeaderWriter( XFrameOptionsMode.SAMEORIGIN)); }
有时,您可能只想为某些请求编写一个header。例如,您可能只想保护您的登录页面。您可以使用DelegatingRequestMatcherHeaderWriter类来这样做。
@Override protected void configure(HttpSecurity http) throws Exception { DelegatingRequestMatcherHeaderWriter headerWriter = new DelegatingRequestMatcherHeaderWriter( new AntPathRequestMatcher("/login"), new XFrameOptionsHeaderWriter()); http.headers() .addHeaderWriter(headerWriter); }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/76509.html
摘要:用于发布身份验证事件的。导入用于安全,配置身份验证,这在非应用程序中也是相关的。安全出于安全考虑,除和之外的所有默认禁用,属性可用于启用。有关保护的其他信息可以在参考指南中找到。 28. 安全 如果在类路径上有Spring Security,那么web应用程序默认是安全的,Spring Boot依赖Spring Security的内容协商策略来决定是使用httpBasic还是formL...
摘要:框架具有轻便,开源的优点,所以本译见构建用户管理微服务五使用令牌和来实现身份验证往期译见系列文章在账号分享中持续连载,敬请查看在往期译见系列的文章中,我们已经建立了业务逻辑数据访问层和前端控制器但是忽略了对身份进行验证。 重拾后端之Spring Boot(四):使用JWT和Spring Security保护REST API 重拾后端之Spring Boot(一):REST API的搭建...
摘要:框架入门简介是一个能够为基于的企业应用系统提供声明式的安全访问控制解决方案的安全框架。 1.Spring Security框架入门 1.1 Spring Security简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(...
摘要:一旦最基本的应用创建好了,你可以给他加上安全防护。一旦成功登出了,我们的应用程序重定向到到并显示相应的登陆成功的消息。这标记该应用程序是一个应用程序,并激活一些关键行为,比如创建一个。一旦应用程序启动,用浏览器访问。 原网页 https://spring.io/guides/gs/securing-web/ 本指南将引导您完成创建一个资源由Spring Security的保护的一个简单...
摘要:启用安全性这个简单的默认配置指定了如何保护请求,以及客户端认证用户的方案。基于数据库进行认证用户数据通常会存储在关系型数据库中,并通过进行访问。必须经过认证其他所有请求都是允许的,不需要认证。要求用户不仅需要认证,还要具备权限。 Spring Security Spring Security 是基于Spring 应用程序提供的声明式安全保护的安全框架。Spring Sercurity ...
摘要:截至年月日,将网站标记为不安全。管理密码使用密码哈希以纯文本格式存储密码是最糟糕的事情之一。是中密码哈希的主要接口,如下所示提供了几种实现,最受欢迎的是和。 Spring Boot大大简化了Spring应用程序的开发。它的自动配置和启动依赖大大减少了开始一个应用所需的代码和配置量,如果你已经习惯了Spring和大量XML配置,Spring Boot无疑是一股清新的空气。 Spring ...
阅读 2356·2021-11-24 10:31
阅读 3403·2021-11-23 09:51
阅读 2216·2021-11-15 18:11
阅读 2355·2021-09-02 15:15
阅读 2434·2019-08-29 17:02
阅读 2255·2019-08-29 15:04
阅读 815·2019-08-29 12:27
阅读 2832·2019-08-28 18:15