使用 Spring Security 的 CSRF 保护

Posted

技术标签:

【中文标题】使用 Spring Security 的 CSRF 保护【英文标题】:CSRF Protection using Spring Security 【发布时间】:2016-09-01 23:33:05 【问题描述】:

有没有办法只使用 Spring Security 实现 CSRF 保护而不使用其他功能,如身份验证和授权?

我尝试了以下配置,但它关闭了 spring-security 的所有功能。想看看是否有办法配置让 csrf 功能保持开启状态。

<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://www.springframework.org/schema/security
    http://www.springframework.org/schema/security/spring-security-4.0.xsd">

    <http auto-config="true" security="none"/>

    <authentication-manager>
        <authentication-provider>
            <user-service>
                <user name="user" password="Password1" authorities="ROLE_USER"/>
            </user-service>
        </authentication-provider>
    </authentication-manager>

</beans:beans>

【问题讨论】:

这个问题并不真正符合该网站的指导方针,您应该在该网站上提出具体问题。你已经用谷歌搜索结果了吗?如果是这样,那么您应该尝试过一些事情并对此提出具体问题。 【参考方案1】:

我也有和你一样的需求,通过spring-security.xml

中的最小配置就能实现
<authentication-manager />
<http create-session="never" use-expressions="true">
    <csrf />
    <http-basic />
</http>

这里的声明spring security不期望认证/授权机制,并假设所有请求都已经过认证。

之后,在您的 web.xml 文件中添加 Spring Security 过滤器。这样可以确保所有请求在被应用控制器处理之前首先通过 Spring 安全机制。

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

然后在您的 JSP(最好是 Header JSP)中,包含 Spring Security 的 Taglib 以在元标记中访问和存储 CSRF 令牌。

<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags"%>

<sec:csrfMetaTags />

<script type="text/javascript">
    var csrfHeader = $("meta[name='_csrf_header']").attr("content");
    var csrfToken = $("meta[name='_csrf']").attr("content");
</script>

在此之后,在所有 Ajax 调用中包含 CSRF 令牌。如果不包括在内,您将收到 403 - 拒绝访问错误。

例如,如果您使用 jQuery 进行 ajax 调用,那么您可以全局配置它以在请求标头中包含 CSRF 令牌。

$(document).ajaxSend(function(e, xhr, options) 
    xhr.setRequestHeader(csrfHeader, csrfToken);
);

执行此操作所需的 JAR 文件是:

    spring-security-acl-5.0.7.RELEASE.jar
    spring-security-config-5.0.7.RELEASE.jar
    spring-security-core-5.0.7.RELEASE.jar
    spring-security-taglibs-5.0.7.RELEASE.jar
    spring-security-web-5.0.7.RELEASE.jar

【讨论】:

以上是关于使用 Spring Security 的 CSRF 保护的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Spring Security 创建 CSRF 令牌

Spring-Security对CSRF攻击的支持

使用 Spring Security 重命名 CSRF 令牌头名称

使用 Spring Security 和 AngularJS 预防 CSRF

CORS与CSRF在Spring Security中的使用

在 spring-security 中更改 csrf 令牌