不赘述什么是csrf了,关于怎么方式csrf伪造,网上有很多资料可以查,比如http://www.ibm.com/developerworks/cn/web/1102_niugang_csrf/ 。我这里直说怎么在express.js里实现方式防护csrf的。
最近mentor想试试node.js。所以新项目就用node.js来做了。采用express.js作为web框架。express.js里面有很多中间件和框架来实现各种功能,基本上能满足“要什么有什么”的需求了。其能力和python等一众脚本语言差不多。
关于express.js怎么使用,https://github.com/nswbmw/N-blog/wiki/_pages 这里有很好的系列教程。我在项目中需要实现方式csrf的功能,基本上就是,需要在提交的表单中添加一个<input type=”hidden” name=”_csrf” value=_csrf />的内容,然后再提交post表单的时候,这个字段也被作为post的参数传递到服务端。 下面是实现方法。
在app.js中添加cookie、session支持,这是基础。
app.use(express.cookieParser());
app.use(express.session({
secret: settings.cookieSecret,
}));
然后添加csrf防护中间件支持。
app.use(express.csrf());
app.use(function(req, res, next){
res.locals.csrf = req.session ? req.session._csrf : "";
next();
});
注意上面的第三行,这里讲csrf值添加进了本地变量中。这样在渲染模板中就可以直接使用这个值了。在相关的.ejs文件中,做如下相应改变(注意我使用的是ejs模板渲染引擎)。
<input type="hidden" name="_csrf" value=<%= csrf%>>
注意上面,我直接在<%= %>标签中使用了csrf变量,这个变量就是在res.locals.csrf=req.session?req.session._csrf:””这时候被赋值并添加进本地变量中的,可以在渲染模板中直接使用。locals变量还可以使用在其他地方。
基本上就是这样,简单,但是需要点明。