spring security CSRF防护

spring security CSRF防护CSRF是指跨站请求伪造(Cross-siterequestforgery),是web常见的攻击之一。从SpringSecurity4.0开始,默认情况下会启用CSRF保护,以防止CSRF攻击应用程序,SpringSecurityCSRF会针对PATCH,POST,PUT和DELETE方法进行防护。我这边是springboot项目,在启用了@EnableWebSecurity…

大家好,又见面了,我是你们的朋友全栈君。

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防护
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148894.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • flex布局以及实现垂直居中

    flex布局以及实现垂直居中flex布局的原理给父盒子添加flex属性,来控制盒子的位置和排列方式(当我们给父元素设置为flex布局以后,子元素的float、clear和vertical-align属性将失效)flex:布局又叫伸缩布局,弹性布局,伸缩盒布局,flex布局flex常见的父项常见属性flex-direction:设置主轴的方向justify-content:设置主轴上的子元素排列方式flex-wrap:设置子元素是否换行align-content:设置侧轴上的子元素的排列方式(多行)align-items

    2022年6月6日
    320
  • Linux之tail查看命令

    Linux之tail查看命令一、语法操作命令:tailoptions文件地址options:-f:该参数用于监视File文件增长。-cNumber:从Number字节位置读取指定文件-nNumber:从Number行位置读取…

    2022年6月4日
    56
  • GBDT算法详解_gbdt算法

    GBDT算法详解_gbdt算法基本思想GBDT的基本结构是决策树组成的森林,学习方式是梯度提升。具体的讲,GBDT作为集成模型,预测的方式是把所有子树的结果加起来。GBDT通过逐一生成决策子树的方式生成整个森林,生成新子树的过程是利用样本标签值与当前树林预测值之间的残差,构建新的子树。例如,当前已经生成了3课子树了,则当前的预测值为D(x)=d1(x)+d2()x+d3(x),此时我们得到的当前的预测值为D(x)效果并不好,与真正的拟合函数f(x)还有一定的差距。GBDT希望的是构建第四棵子树,使当前树林的预测结果D(x)与第四棵

    2022年10月12日
    0
  • python中选择排序法对数组进行升序排序_sort函数对字符串数组排序

    python中选择排序法对数组进行升序排序_sort函数对字符串数组排序这三个排序方法应对日常工作基本够用先说一下三者的区别sort,sorted是用在list数据类型中的排序方法argsort是用在numpy数据类型中的排序方法(numpy里也有一个sort方法,下面会讲)sort和sorted的区别如下????先看两个简单的升序排序,分别使用sorted和sort方法#sortednum_list=[1,8,2,3,10,4,5]ordered_list=sorted(num_list)print

    2022年8月13日
    3
  • ubuntu、win跨平台局域网文件传输工具「建议收藏」

    ubuntu、win跨平台局域网文件传输工具「建议收藏」DuktoR6官网:https://www.msec.it/blog/dukto/win10不可使用NitroShare官网:https://nitroshare.net/win10可使用

    2022年6月4日
    33
  • 爱,该放弃吗_有一种爱叫做放手

    爱,该放弃吗_有一种爱叫做放手爱,绝不是缺了就找,更不是累了就换。   找一个能一起吃苦的,而不是一起享受的   找一个能一起承担的,而不是一起逃避的   找一个能对你负责的,而不是对爱情负责的   爱情是盲目的,生活是现实的   因为爱情只不过是人类为了逃避现实而衍生的产品   为了逃避现实,我寻找爱情   为了寻找爱情,我失去真情   失去了真情,才发现早已身陷虚情.   你以为爱情是什么?   一点点的动心,一点点的冲动

    2022年9月20日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号