配置Spring Security 3.2后,csrf。令牌未绑定到请求或会话对象。
这是Spring Security配置:
<http pattern="/login.jsp" security="none"/>
<http>
<intercept-url pattern="/**" access="ROLE_USER"/>
<form-login login-page="/login.jsp"
authentication-failure-url="/login.jsp?error=1"
default-target-url="/index.jsp"/>
<logout/>
<csrf />
</http>
<authentication-manager>
<authentication-provider>
<user-service>
<user name="test" password="test" authorities="ROLE_USER/>
</user-service>
</authentication-provider>
</authentication-manager>
login.jsp文件
<form name="f" action="${contextPath}/j_spring_security_check" method="post" >
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
<button id="ingresarButton"
name="submit"
type="submit"
class="right"
style="margin-right: 10px;">Ingresar</button>
<span>
<label for="usuario">Usuario :</label>
<input type="text" name="j_username" id="u" class="" value=''/>
</span>
<span>
<label for="clave">Contraseña :</label>
<input type="password"
name="j_password"
id="p"
class=""
onfocus="vc_psfocus = 1;"
value="">
</span>
</form>
它呈现下一个html:
<input type="hidden" name="" value="" />
结果是403 HTTP状态:
Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.
在一些调试之后更新,请求对象以良好的形式发出DelegatingFilterProxy,但在CoyoteAdapter的469行中,它执行请求。回收();这会删除所有属性。。。
我使用JDK 1.7在Tomcat 6.0.36、7.0.50中进行测试。
我不理解这种行为,而不是,如果有人向我指出一些与CSRF一起使用的Spring Security 3.2的应用程序示例战的方向,这是可能的。
如果您将应用安全性,则不会生成csrf令牌。页面将不会通过安全筛选器。使用角色匿名。
我没有详细说明,但它对我有用。
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/login.jsp" access="hasRole('ANONYMOUS')" />
<!-- you configuration -->
</http>
您是否应该添加到登录表单中?;
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
如Spring Security文档中此处所述
Spring应用程序中的CSRF(跨站点请求伪造)保护似乎已启用。实际上,它是默认启用的。
根据spring。io:
什么时候应该使用CSRF保护?我们的建议是对普通用户可以通过浏览器处理的任何请求使用CSRF保护。如果您只创建非浏览器客户端使用的服务,您可能希望禁用CSRF保护。
因此,要禁用它:
@Configuration
public class RestSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
}
}
如果您想保持启用CSRF保护,那么您必须在表单中包含csrfToken
。您可以这样做:
<form .... >
....other fields here....
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
</form>
您甚至可以在表单的操作中包含CSRF令牌:
<form action="./upload?${_csrf.parameterName}=${_csrf.token}" method="post" enctype="multipart/form-data">
概述 我将使用API网关作为基于Spring Security性的身份验证。我刚刚按照https://spring.io/guides/tutorials/spring-security-and-angular-js/链接中的步骤创建了一个基于其对应的github项目的“对双”模块的项目https://github.com/spring-guides/tut-spring-security-and
Symfony中的默认CSRF预防是基于表单的(如果使用提供的表单生成器,则会自动发生)。然而,对于AJAX请求,手动将CSRF令牌附加到每个HTTP请求,然后手动检查每个请求,这是非常繁琐的。 一个好的方法是将令牌嵌入为HTTP标头,如本问题的注释中建议的那样。jQuery然后可以被配置为在每个请求中包含这个标头,如这里所述。 我的问题是如何在Symfony内最好地处理这个问题?我可以使用Twi
我在Spring5(Boot2)RESTful web服务中配置了CSRF保护,因为我希望防止CSRF攻击(我使用cookie进行身份验证和授权)。在每个请求中,我都会得到一个新的cookie。我通过标头发回的cookie的值。 我注意到、和方法需要此标记的值(在标头中)才能正常工作,但是方法没有标头也可以正常工作。 这种行为是故意的,因为方法不应该改变状态,还是我做错了什么?
我遇到了CodeIgniter/CSRF/JSON的问题。 我正在向PHP后端发送内容类型为“application/json”的http POST请求。有效负载是json数据。我将与数据一起传递生成并存储在CSRF cookie中的CSRF令牌。对于标准POST表单请求,它工作正常,但作为json发送时失败。 由于$\u POST数组因JSON内容类型而为空,CodeIgniter无法验证coo
我导入了这两个包(csrf、cookieparser),并在appjs中使用了express-js,它只工作,而且我在postman中测试了它的工作情况,这里是我的代码express-js: 还有我使用 react js 的前端,在 useEffect 中,我从后端获取 csrf,然后我保存在 axios 的标头中,但是当我向后端发送请求时,响应说无效的 csrf :/ 来自服务器的响应:Forb
我有一个新的Symfony 3.0的奇怪问题。1安装。我用一个包含url和标题的表单PostType生成了一个新的CRUD控制器。没什么特别的。 表单按预期呈现。它包含我的url字段和标题字段。表单内部还呈现隐藏的输入字段_标记。 提交此表单时,我始终收到以下错误: 所以令牌被添加到表单中,它包含一个值,我有一个常量PHP会话cookie值,它只是使这个令牌无效。 我已经搜索了其他答案,但类似的问