Error: invalid csrf token

版权所有: 一介布衣  
原文地址: http://yijiebuyi.com/blog/74528e6546834ebfec47daf4e222d621.html  
无特别说明均为原创,欢迎各种形式转载,转载请保留此段申明。

当你的Express 升级到4.0+版本后,有没有遇到过下面这个问题.

{    [Error: invalid csrf token]   expose: true,   code: 'EBADCSRFTOKEN',   statusCode: 403,   status: 403  }

上面的错误是在node.js 运行环境的命令行报出来的.页面直接返回了500服务器错误.

我执行了什么操作?

这是我的一个新站 三思悦 ,此站有个功能是邀请注册,不对外公开注册的.

所以管理后台有个页面用来显示 邀请码,同时有个按钮,用来生成验证码,一次生成唯一不重复的50个.

所以这个页面对应2个相同的url ,只不过get方式用来呈现为被使用的邀请码,post 方式用来生成50个验证码并刷新本页.

其中 post 涉及到一个 form 提交.

上面报错的 csrf 是什么? 引用百度百科的一段说法

"CSRF(Cross-site request forgery跨站请求伪造,也被称为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。"

风险:

"风险在于那些通过基于受信任的输入form和对特定行为无需授权的已认证的用户来执行某些行为的web应用。已经通过被保存在用户浏览器中的cookie进行认证的用户将在完全无知的情况下发送HTTP请求到那个信任他的站点,进而进行用户不愿做的行为。"

那么Express 中为什么要有这个 csrf ? 原因就是为了避免 上面提到的风险,防止被 CSRF攻击.

在Express 中如何开启:

var csurf = require('csurf'); //使用前要 npm install csurfapp.use(function (req, res, next) {     csurf()(req, res, next);     next(); });

下面用一个客户端公共变量来储存此值

app.use(function (req, res, next) {   res.locals.csrf = req.csrfToken ? req.csrfToken() : '';   next(); });

这样我在页面中 直接用 <%- csrf %> 就可以得到此值. 

而上面的报错,正是因为post 的form 里面没有提交这个 csrfToken 值,导致上面的代码赋值时报错.

客户端可以用隐藏字段保存此值

<input type='hidden' name='_csrf' value='<%= csrf %>'/>

这样提交 Express 就不会报错了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值