spring security CSRF防护的示例代码
程序员文章站
2024-02-27 18:26:21
csrf是指跨站请求伪造(cross-site request forgery),是web常见的攻击之一。
从spring security 4.0开始,默认情况下...
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 @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防护 } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
spring security CSRF防护的示例代码
-
使用Spring Boot+MyBatis框架做查询操作的示例代码
-
Redis 集成Spring的示例代码(spring-data-redis)
-
Spring Security OAuth2实现使用JWT的示例代码
-
Spring Boot使用模板freemarker的示例代码
-
Spring-data-redis操作redis cluster的示例代码
-
ActiveMQ结合Spring收发消息的示例代码
-
Spring Boot应用的极速部署脚本示例代码
-
使用Spring Data JDBC实现DDD聚合的示例代码
-
spring boot整合Swagger2的示例代码