使用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 +百里香
答案 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()