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