天天看点

Spring Security(十四)跨域请求伪造的防护

一.简介

CSRF的全称是(Cross Site Request Forgery),可译为跨域请求伪造,是一种利用用户带登录态的cookie进行安全操作的攻击方式。CSRF实际并不难防,但常常被系统开发者忽略而埋下巨大的安全隐患。

二.实战

CookieCsrfTokenRepository方式

它将CsrfToken值存储在用户的cookie内。首先,减少了服务器HttpSession存储的内存消耗;其次,当用cookie存储CsrfToken值时,前端可以用JavaScript读取(需要设置该cookie的httpOnly属性为false),而不需要服务器注入参数,在使用方式上更加灵活。

存储在cookie上,不就可以被CSRF利用了吗?事实上并不可以。cookie只有在同域的情况下才能被读取,所以杜绝了第三方站点跨域获取CsrfToken值的可能。CSRF攻击本身不知道cookie内容的,只是利用了当请求自动携带cookie时可以通过身份验证的漏洞。但服务器对CsrfToken值的校验并非取自cookie,而是需要前端手动将CsrfToken值作为参数携带在请求里,所以cookie内的CsrfToken值并没有被校验的作用,仅仅作为一个存储容器使用。

修改Spring Security的csrfTokenRepository。

@Override
    protected void configure(HttpSecurity http) throws Exception{
        http.authorizeRequests()
                .antMatchers("/admin/api/**").hasRole("ADMIN")
                .antMatchers("/user/api/**").hasRole("USER")
                .antMatchers("/app/api/**").permitAll()
                .anyRequest().authenticated()
                .and()
                .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())// CSRF配置
                .and()
                .formLogin()
                .and()
                .sessionManagement()
                // 最大会话数设置
                .maximumSessions(1)
                // 阻止新会话登录
                .maxSessionsPreventsLogin(true);
    }
           
相关代码:https://github.com/o99o/SpringSecurity/tree/master/SpringSecurity_13_CSRF

继续阅读