首页 > 开发 > Java > 正文

spring security CSRF防护的示例代码

2024-07-14 08:43:54
字体:
来源:转载
供稿:网友

CSRF是指跨站请求伪造(Cross-site request forgery),是web常见的攻击之一。 

从Spring Security 4.0开始,默认情况下会启用CSRF保护,以防止CSRF攻击应用程序,Spring Security CSRF会针对PATCH,POST,PUT和DELETE方法进行防护。 

我这边是spring boot项目,在启用了@EnableWebSecurity注解后,csrf保护就自动生效了。 

所以在默认配置下,即便已经登录了,页面中发起PATCH,POST,PUT和DELETE请求依然会被拒绝,并返回403,需要在请求接口的时候加入csrfToken才行。 

如果你使用了freemarker之类的模板引擎或者jsp,针对表单提交,可以在表单中增加如下隐藏域:

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

如果您使用的是JSON,则无法在HTTP参数中提交CSRF令牌。相反,您可以在HTTP头中提交令牌。一个典型的模式是将CSRF令牌包含在元标记中。下面显示了一个JSP示例:

<html> <head>   <meta name = “_csrf” content = “${_csrf.token}” />   <!-- 默认标题名称是X-CSRF-TOKEN -->   <meta name = “_csrf_header” content = “${_csrf.headerName}” /> </ head> 

然后,您可以将令牌包含在所有Ajax请求中。如果您使用jQuery,可以使用以下方法完成此操作:

var token = $("meta[name='_csrf']").attr("content");var header = $("meta[name='_csrf_header']").attr("content");$.ajax({  url:url,  type:'POST',  async:false,  dataType:'json',  //返回的数据格式:json/xml/html/script/jsonp/text  beforeSend: function(xhr) {    xhr.setRequestHeader(header, token); //发送请求前将csrfToken设置到请求头中  },  success:function(data,textStatus,jqXHR){  }});

如果你不想启用CSRF保护,可以在spring security配置中取消csrf,如下:

@Configuration@EnableWebSecuritypublic class WebSecurityConfig extends WebSecurityConfigurerAdapter {  @Override  protected void configure(HttpSecurity http) throws Exception {    http.authorizeRequests()        .antMatchers("/login").permitAll()        .anyRequest().authenticated()        .and()        ...    http.csrf().disable(); //取消csrf防护  }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VeVb武林网。


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表