403禁止无效的CSRF

问题描述 投票:1回答:2

我正在使用spring security和thymeleaf构建一个Web应用程序,我使用登录和注销工作,但是当我尝试注册为最终用户时,我遇到了一些问题。我收到无效的csrf令牌错误。我是新手,我可以使用一些帮助。我的问题是如何将令牌附加到该请求?(发布/注册)顺便说一下,我没有使用任何XML,我使用注释。

这是请求

    $scope.registerUser = function() {
      $http.post(BASE_URL + "/registration", $scope.registrationRequest).
          success(function (data, status, headers, config) {
            $log.info("Success: " + headers('Location'));
            $scope.hasRegistered = true;
          }).error(function(data, status, headers, config) {
             $scope.hasRegisterErrors = true;
             $log.info("Error: status =" + status + ", body =" + JSON.stringify(data));
          });
  }

而错误

    Error: status =403, body ={"timestamp":1430645356572,"status":403,"error":"Forbidden","message":"Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.","path":"/registration"}
spring spring-security csrf
2个回答
0
投票

响应消息告诉您服务器希望您的POST请求包含“_csfr”参数或“X-CSRF-TOKEN”标头。据推测,您的服务器已启用CSFR保护。这是Spring Security的默认行为,但您可以禁用它。 (我不建议这样做。)

Spring Security文档中的Cross Site Request Forgery (CSRF)章节解释了这一切的全部内容。 This section解释了如何实现CSRF令牌,包括如何将令牌嵌入HTML <form>或将其包含在AJAX请求中的示例。


0
投票

您应该在请求中添加csrf参数作为参数。例如,使用以下代码在表单中定义输入以获取csrf标记并添加为请求参数以通过表单发送发布请求:

<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>

或使用以下代码作为ajax调用发送:

<meta name="_csrf" content="${_csrf.token}"/>
<meta name="_csrf_header" content="${_csrf.headerName}"/>

然后构造标题:

var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");

$(document).ajaxSend(function(e, xhr, options) {
    xhr.setRequestHeader(header, token);
});

因此,您需要获取srcf令牌作为请求中的参数发送。通过spring security,您可以通过以下配置定义csrf参数名称:

<http>
    <!-- ... -->
    <csrf token-repository-ref="tokenRepository"/>
</http>
<bean id="tokenRepository"
    class="org.springframework.security.web.csrf.CookieCsrfTokenRepository"
    p:cookieHttpOnly="false">
    <property name="sessionAttributeName" value="_csrf"/>
    <property name="headerName" value="_csrf_header"/>
</bean>

更多信息,请参阅以下链接:https://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html https://spring.io/blog/2013/08/21/spring-security-3-2-0-rc1-highlights-csrf-protection/ http://www.baeldung.com/spring-security-csrf

© www.soinside.com 2019 - 2024. All rights reserved.