为你的Express应用增加CSRF防护打赏

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

众所周知,Web系统并没有绝对的安全,就比如我们公司年前遇到的情况,有些恶心网站通过网络抓包等手段,截取验证码发送接口,通过伪造请求实现了传入任意手机号并发送验证码的功能,虽然这看起来并没有什么用,但当这些不法分子拔了成百上千个接口后,就形成了一个疯狂的短信轰炸机,对于服务提供者,这些地下网站只要有人使用,就会不断得消耗短信费用,给企业带来不必要的损失。

当然,这只是个例中的一个,其他种种安全隐患,不在一一举例,这里也是因为公司接口被这些不法分子恶意利用,才想到增加CSRF防护。

因为网站采用中途岛模式,后端Java,前端后端之间架设一层NodeJS的桥梁,为了避免跨域,所有api通过NodeJS层中转,而NodeJS层使用了Express作为Web服务器,所以这里可以采用中间件(csurf)很简单的实现CSRF防护,下面简单的集成步骤:

1、安装csurf

npm install csurf --save

2、在全局范围或特定需要做控制的页面输出csrf token

//全局路由
router.all('*', csrf({
    cookie: true
}), function (req, res, next) {
    next();
});

3、在表单提交或异步接口请求发出时携带第二步输出的csrf token,用于后端校验,校验通过,走正常业务逻辑,反之返回403

//server api
router.all('/api/*', csrf({
    cookie: true,
    //拦截所有method,默认忽略['GET', 'HEAD', 'OPTIONS']
    ignoreMethods: []
}), function (req, res, next) {
    next();
});

如此配置后,不携带csrf token的请求都会呈现403或自己自定义错误信息页面等。

但这样还是免不了别人通过抓取页面等形式获取csrf token并在伪造请求时一同发出,考虑到什么短信轰炸机之类的作者都是大量接口使用,不会在意个别接口的单独校验,这里就没进一步处理。如果有类似需求,可以考虑,csrf token输出时加密,回传时解密后回传,也可以实现多种加密方案,每次配对动态输出到页面,另外最好额外增加图片验证码、SSL等。

最后在补充一句,没有绝对安全的Web应用,但这样做还是能起到一定的作用,视情况而用即可。

为你的Express应用增加CSRF防护
文章《为你的Express应用增加CSRF防护》二维码
  • 微信打赏
  • 支付宝打赏

已有1条评论

  1. 穷小子

    2017.03.22,disqus匿名评论测试

    2017-03-22 14:44 回复

(必填)

(必填)

(可选)