好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

spring security CSRF防护的示例代码

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,针对表单提交,可以在表单中增加如下隐藏域:

?

1

<input type = [hidden] name = [${_csrf.parametername}] value = [${_csrf.token}] />

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

?

1

2

3

4

5

6

<html>

<head>

   <meta name = [_csrf] content = [${_csrf.token}] />

   <!-- 默认标题名称是x-csrf-token -->

   <meta name = [_csrf_header] content = [${_csrf.headername}] />

</ head>

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

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,如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

@configuration

@enablewebsecurity

public class websecurityconfig extends websecurityconfigureradapter {

   @override

   protected void configure(httpsecurity http) throws exception {

     http.authorizerequests()

         .antmatchers( "/login" ).permitall()

         .anyrequest().authenticated()

         .and()

         ...

     http.csrf().disable(); //取消csrf防护

   }

}

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

原文链接:https://blog.csdn.net/yjclsx/article/details/80349906

查看更多关于spring security CSRF防护的示例代码的详细内容...

  阅读:20次