我是Node的新手所以如果这是一个菜鸟问题,请原谅我。我正试图在github上使用转换这个项目来使用ejs视图,但很难理解他们是如何创建csrf标记的。
我正在使用的种子项目 - https://github.com/sahat/hackathon-starter
使用lusca生成csrf https://github.com/krakenjs/lusca
我在他们的种子项目中看到的代码(至少我认为是相关的)
var csrf = require('lusca').csrf();
/**
* CSRF whitelist.
*/
//app.js
var csrfExclude = ['/url1', '/url2'];
//original project uses jade
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade'); //i'm going to change this to ejs, but don't know where to get the csrf value(below) from
app.use(function(req, res, next) {
// CSRF protection.
if (_.contains(csrfExclude, req.path)) return next();
csrf(req, res, next);
});
app.use(function(req, res, next) {
// Make user object available in templates.
res.locals.user = req.user;
next();
});
app.use(function(req, res, next) {
// Remember original destination before login.
var path = req.path.split('/')[1];
if (/auth|login|logout|signup|fonts|favicon/i.test(path)) {
return next();
}
req.session.returnTo = req.path;
next();
});
//route controllers
app.get('/', homeController.index);
//in separate controller file - home.js
exports.index = function(req, res) {
res.render('home', {
title: 'Home'
});
};
//inside their jade file - this is converted to html tag --- <meta name="csrf-token" content="cRcgih7Vl1Ms2Xz0zgIeAyWwQm6s4kp3/8OS4=">
meta(name='csrf-token', content=_csrf)
//so value _csrf is converted to cRcgih7Vl1Ms2Xz0zgIeAyWwQm6s4kp3/8OS4=
我的困惑是从哪里拉出_csrf标签?我试图通过所有文件grep这个关键字,并没有实际看到它设置在任何地方(可能会遗漏什么?)。我正在查看我的检查器,并且能够看到会话变量设置为req.session._csrfSecret = nLzJqL3YIAJVzA ==,但这看起来与上面使用的密钥不同。基于/ 8OS4,我认为该值实际上是在某处连接的。
我的问题是 - 在jade模板中,这个_csrf值来自哪里?我没有看到jade在js代码中从哪里抓取它(我没有在响应中看到_csrf设置在任何地方)。
或者使用lusca创建和保存csrf值的正常方法是什么?
感谢您的帮助!
答案 0 :(得分:1)
我正准备回答这个问题,但看起来有人打败了我:https://groups.google.com/forum/#!topic/nodejs/Zwnw4wOAtxw。只是张贴这个以防其他人需要帮助。