Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'

Spring Security :HTTP Status 403-Invalid CSRF Token ‘null‘ was found on the request parameter ‘_csrf‘ or header ‘X-CSRF-TOKEN‘.

原因:
1.Spring Security 4.0之后,引入了CSRF,默认是开启。CSRF默认支持的方法: GET|HEAD|TRACE|OPTIONS,不支持POST。
Spring Security 3默认关闭csrf,Spring Security 4默认启动了csrf。

2.什么是csrf:
这是一个web应用安全的问题,CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack” 或者Session Riding,攻击方通过伪造用户请求访问受信任站点。
我们知道,客户端与服务端在基于http协议在交互的数据的时候,由于http协议本身是无状态协议,后来引进了cookie的 方式进行记录服务端和客户端的之间交互的状态和标记。cookie里面一般会放置服务端生成的session id(会话ID)用来识别客户端访问服务端过 程中的客户端的身份标记。

跨域 (科普一下:同一个ip、同一个网络协议、同一个端口,三者都满足就是同一个域,否则就有跨域问题) 的情况下, session id可能会被恶意第三方劫持,此时劫持这个session id的第三方会根据这个session id向服务器发起请求,此时服务器收到这个请求会 认为这是合法的请求,并返回根据请求完成相应的服务端更新。

如果这个http请求是get方式发起的请求,意味着它只是访问服务器 的资源,仅仅只是查询,没有更新服务器的资源,所以对于这类请求,spring security的防御策略是允许的;

如果这个请求是通过post请求发起的, 那么spring security是默认拦截这类请求的,因为这类请求是带有更新服务器资源的危险操作,如果恶意第三方可以通过劫持session id来更新 服务器资源,那会造成服务器数据被非法的篡改,所以这类请求是会被Spring security拦截的,在默认的情况下,spring security是启用csrf 拦截功能的,这会造成,在跨域的情况下,post方式提交的请求都会被拦截无法被处理(包括合理的post请求),前端发起的post请求后端无法正常 处理,虽然保证了跨域的安全性,但影响了正常的使用,如果关闭csrf防护功能,虽然可以正常处理post请求,但是无法防范通过劫持session id的非法的post请求,所以spring security为了正确的区别合法的post请求,采用了token的机制。

在跨域的场景下,客户端访问服务端会首先发起get请求,这个get请求在到达服务端的时候,服务端的Spring security会有一个过滤 器 CsrfFilter去检查这个请求,如果这个request请求的http header里面的X-CSRF-COOKIE的token值为空的时候,服务端就好自动生成一个 token值放进这个X-CSRF-COOKIE值里面,客户端在get请求的header里面获取到这个值,如果客户端有表单提交的post请求,则要求客户端要 携带这个token值给服务端,在post请求的header里面设置_csrf属性的token值,提交的方式可以是ajax也可以是放在form里面设置hidden 属性的标签里面提交给服务端,服务端就会根据post请求里面携带的token值进行校验,如果跟服务端发送给合法客户端的token值是一样的,那么 这个post请求就可以受理和处理,如果不一样或者为空,就会被拦截。由于恶意第三方可以劫持session id,而很难获取token值,所以起到了 安全的防护作用。

解决方案:
如果不采用csrf,可禁用security的csrf
Java注解方式配置:加上 .csrf().disable()

public class SecurityConfig extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().antMatchers("/").access("hasRole(‘READER‘)")
    .antMatchers("/*").permitAll()
    .and()
    .formLogin()
    .loginPage("/login")
    .failureUrl("/login?error=true");
    http.csrf().disable();
  }
}

Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'

时间: 2024-11-03 03:29:02

Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'的相关文章

Unable to add window -- token null is not for an application

代码中出现如下错误: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 分析: 问题在于new AlertDialog.Builder(Context),虽然这里的参数是AlertDialog.Builder(Context context) 但我们不能使用getApplicationContext()获得的Context,而必须使用

unexpected token: null near line 1, column 290

org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: null near line 1, column 290 [select count(*) from cn.com.taiji.sample.entity.User t where 1=1 and (t.name like :userName or t.namePy like :userName or t.loginName like :userName

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application

原博客地址:http://aijiawang-126-com.javaeye.com/blog/662336 在Activity中newSpinner是我把mContext传入,但是出了 android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application这个错误,参考了达人的文章终于搞定. [java] view plaincopy private C

Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application

在广播中启动一个Dialog时出现如下错误信息:Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 在代码中添加了dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);错误信息没有消除, 此时在Manifest.xml文件中

mysql ”Invalid use of null value“ 解决方法

1.问题描述 因为要更改"information"表中的"编号"列为非空,使用数据库查询语句"alter table information modify '编号' varchar(255) not null"可以更改其他的列,但只是在编号列出错,错误信息为Invalid use of NULL value. 很是奇怪,其他列使用该命令可以查,为什么仅有编号列无法查. 2.错误原因 出现该错误的原因可能是因为已存在的数据的'编号'列为null,与

mysql 修改列为not null报错Invalid use of NULL value

场景:mysql 给表新增parent_id列,并设置为not null,保存时报错Invalid use of NULL value. 报错原因:因为已存在的数据的parent_id列为null,与not null的设置冲突. 解决办法:新增parent_id列后,先update已存在数据的parent_id为默认值,例如-1.然后修改该列的not null属性,保存成功. 原文地址:https://www.cnblogs.com/lxwphp/p/9055157.html

Laravel5.0 CSRFチェックを無効化(修改后可以像5.1以上那样从CSRF保护中排除指定URL)

Laravel5では全てのPOSTに勝手にCSRFチェックが付いてきます.便利と言えば便利ですが.Laravel外からのPOSTを受け取りたいときなど大迷惑です. CSRFチェックを排除する方法が何故かなかなか見当たらなかったので調査結果を記載. Kernel デフォルトで適用されるミドルウェアはapp/Http/Kernel.phpに記載されています.'App\Http\Middleware\VerifyCsrfToken'が書かれている行を削除するとCSRFチェックが無効化されます. この場

MySQL错误代码1138:invalid use of null value的原因及解决办法-s

表格数据我就不给了,具体原因还是:在最初没有设置默认值为not null,而后期想要修改时报错了,因为这时修改会影响很多值的初始化设置,而且不统一,可能有的列允许为空,有的列不允许为空.这时,可以进行以下操作完成.比较详细的阐述请看这里:http://www.zhimengzhe.com/shujuku/MySQL/34845.html 我自己理解的东西,转述的时候往往会有歧义或着让别人听不懂.看不懂,所以我会找到解决办法之后,理解并消化同时带上我参考文章的链接.这样能让我以及后面看到这个博客的

Mysql: Invalid use of null value

今天在alter一个table的时候报了这个错误. 原因是我要将一个字段从null改为not null,但是数据表里已经有几条记录了,这些记录的这个字段的值是null,所以alter table的时候就报错了. 解决: 现将这个字段的值改为非null的值,比如一个空字符串: update `scheme_xx`.`table_xx` set `field_xx` = '' where id < 1000; 然后再alter table就OK了. 原文地址:https://www.cnblogs.