CSRF необходимо отключить для безопасности Spring Spring - PullRequest
0 голосов
/ 08 мая 2020

Все мои интерфейсы REST работают нормально с включенной защитой csrf, но мне нужно отключить csrf для / login, иначе я получаю 403 Forbidden. Я использую Spring Security, путь входа в систему доступен через Spring Security.

http.csrf().disable() 

Как отключить защиту csrf для определенных страниц на моем веб-сайте?

Или, если это не проблема отключить CSRF на странице входа, проблема также будет исправлена ​​

EDIT:

.csrf().ignoringAntMatchers("/login")

Маршрут входа всегда требует тела входа, поэтому не должно быть потенциала атаки CSRF не так ли?

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

Попробуйте это:

Изменение в Spring-Security. xml:

<security:http  use-expressions="true" authentication-manager-ref="authenticationManager">
    <security:intercept-url pattern="/auth/**" access="hasAnyRole('ROLE_USER')" />
    <security:form-login login-page="/login" authentication-success-handler-ref="loginSuccessHandler" authentication-failure-url="/login" login-processing-url="/j_spring_security_check" />
    <security:logout invalidate-session="true" logout-url="/logout" success-handler-ref="logoutSuccessHandler" />

    <security:csrf request-matcher-ref="csrfSecurityRequestMatcher"  />
</security:http>

CsrfSecurityRequestMatcher

public class CsrfSecurityRequestMatcher implements RequestMatcher {
    private Pattern allowedMethods = Pattern.compile("^(GET|HEAD|TRACE|OPTIONS)$");
    private RegexRequestMatcher unprotectedMatcher = new RegexRequestMatcher("/ext/**", null);

    @Override
    public boolean matches(HttpServletRequest request) {          
        if(allowedMethods.matcher(request.getMethod()).matches()){
            return false;
        }
        return !unprotectedMatcher.matches(request);
    }
}
0 голосов
/ 08 мая 2020

если вы не используете теги формы spring mvc, вы не можете автоматически использовать поддержку csrf безопасности spring, возможно, вы используете простые теги формы html, поэтому вы получаете http 403, вам нужно вручную включить токен csrf при отправке формы.

Либо вам нужно использовать теги формы spring mvc, подобные этому

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
…
<form:form action="" method="POST">
…
</form:form> 

, либо добавить токен csrf в обычную отправку формы html вручную.

<form action="" method="POST">
<input type="hidden" name="${_csrf.parameterName}" value = "${_csrf.token}" />
…
</form> 
...