当通过自定义令牌使用授权时,为什么需要关闭SpringSecurity中的csrf

gg58donl  于 2023-01-17  发布在  Spring
关注(0)|答案(1)|浏览(581)

我看了一个关于令牌授权和身份验证的培训视频,在连接过滤器的方法中有一个条目http.csrf().disable()。为什么我们要禁用csrf保护,这个人没有解释? 我所说的:

@Configuration
@RequiredArgsConstructor
public class SecurityConfig{
    private final JwtTokenProvider jwtTokenProvider;

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .httpBasic().disable()
                .csrf().disable()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeHttpRequests(authz ->
                        {
                            try {
                                authz
                                        .requestMatchers("/api/auth/**").permitAll()
                                        .requestMatchers("/api/admin/sensors/**").hasAuthority("ROLE_ADMIN")
                                        .requestMatchers("/api/sensors/**").hasAnyAuthority("ROLE_ADMIN", "ROLE_USER")
                                        .anyRequest().authenticated()
                                        .and()
                                        .apply(new JwtConfigurer(jwtTokenProvider));
                            } catch (Exception e) {
                                throw new RuntimeException(e);
                            }
                        }
                );
        return http.build();
    }
}
4jb9z9bj

4jb9z9bj1#

CSRF是攻击者利用浏览器工作方式的漏洞。在更传统的Web应用程序中,会话令牌(允许应用程序验证请求)在Cookie中发送。Cookie由浏览器发送,请求基于请求的位置 * 到 *,而不考虑请求的来源 * 从 *。因此,如果您登录到这样的应用程序,并访问恶意网站,该恶意网站可以让您无意中向受害网站发出请求,您的会话cookie将自动发送。因此,为了防止攻击者设置此类恶意网站,并让您向受害网站发出请求,从而执行您不希望执行的操作,受害网站需要实施针对CSRF的保护。有多种技术可以实现这一点,例如,网站可以创建一个随机CSRF令牌,将其包含在表单中并存储在服务器端,并期望它在每次提交表单时返回。这是可行的,因为攻击者在从恶意网站发出请求时无法包含正确的令牌。(此外,令牌属于经过身份验证的用户,因此即使攻击者下载页面以获取CSRF令牌,该令牌对其他登录用户也无效。
请注意,以上所有内容都依赖于cookie将自动发送这一事实,如果像您的示例中那样,身份验证令牌作为其他内容发送(就像授权头),浏览器不会自动包含它。恶意网站上的攻击者仍然可以让你向受害网站发出请求,但是,你的授权信息不能包含在内,所以它无论如何都不会工作--无论这样的请求能做什么,攻击者无论如何都可以自己做(除了一些非常特殊的情况)。
因此,如果身份验证基于不是自动发送的内容,则可以禁用CSRF保护。

相关问题