如何禁用网站中特定页面的CSRF保护?

时间:2019-07-16 12:02:14

标签: spring spring-boot spring-security thymeleaf csrf

使用CSRF保护,以便来自其他网站的任何请求都不会影响我的网站而造成伤害。在spring security csrf文档中,有人说csrf用于放置后补丁删除请求。

但是,据我了解,登录/注册表单不需要csrf保护,因为它们已经需要用户名和密码形式的凭据,即使从其他网站发出这样的请求,也不会造成伤害。用户将刚刚登录。

但是由于登录通常是一个发布请求,因此默认情况下,spring默认会在此处自动应用csrf。这意味着我将需要将csrf令牌生成参数作为隐藏输入字段添加到表单中,如下所示:

<form th:action="@{/login}" method="post">    
    <fieldset>
        <input type="hidden" 
             th:name="${_csrf.parameterName}" 
             th:value="${_csrf.token}" />
    </fieldset>
    ...
</form>

如果我不添加此内容,则会出现403禁止错误。但是,如果我像这样禁用此csrf,则:。

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable();
}

然后所有页面都失去了网站中的csrf保护。我如何将csrf应用于某些页面,而不应用于其他页面,即使它们正在发出发布请求?

我正在使用Spring Boot + Spring Security +百里香

1 个答案:

答案 0 :(得分:0)

您可以在.csrf().ignoringAntMatchers("/login")中使用configure(HttpSecurity http)

csrf()。ignoringAntMatchers(“ String”)

允许指定不使用CSRF保护的HttpServletRequest,即使它们与requireCsrfProtectionMatcher(RequestMatcher)相匹配。

  

例如,以下配置将确保CSRF保护   忽略:

     
      
  • 任何GET,HEAD,TRACE,OPTIONS(这是默认设置)
  •   
  • 我们还明确声明忽略任何以“ / sockjs /”开头的请求
  •   
    http
          .csrf()
              .ignoringAntMatchers("/sockjs/**")
              .and()
          ...

.csrf()。ignoringRequestMatchers(requestMatchers)

  

允许指定不应使用CSRF的HttpServletRequests   保护,即使它们与   requireCsrfProtectionMatcher(RequestMatcher)。

     

例如,以下配置将确保CSRF保护   忽略:

     
      
  • 任何GET,HEAD,TRACE,OPTIONS(这是默认设置)
  •   
  • 我们还明确声明忽略具有“ X-Requested-With:XMLHttpRequest”标头的任何请求
  •   
http
     .csrf()
         .ignoringRequestMatchers(request -> "XMLHttpRequest".equals(request.getHeader("X-Requested-With")))
         .and()