在 NodeJS 中使用 CSRF
Using CSRF in NodeJS
我正在尝试在我的 NodeJS 应用程序中使用 csrf。
你可以看到下面的代码。当我 运行 此代码时,我收到 "TypeError: req.csrfToken is not a function" 错误。
我想为所有请求创建 csrf 令牌,并想在 ajax 调用中检查 csrf 令牌。正如我所说,我无法创建 csrf 令牌,我遇到了错误。另外,如何在 ajax 调用中检查 csrf 令牌?
你能帮帮我吗?
谢谢
服务器端:
var express = require('express');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var csrf = require('csurf');
var bodyParser = require('body-parser');
/*this line commented*/
//var csrfProtection = csrf({ cookie: false });
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
var parseForm = bodyParser.urlencoded({ extended: false });
app.use(cookieParser());
/*this line added*/
app.use(csrf({ cookie: false }));
app.use(session({
genid: function (req) {
return "lkgktktgjknvfndkj-dfgjnkdfkjgn-dfgdfg";
},
name: "mySecret",
resave: false, // don't save session if unmodified
saveUninitialized: false, // don't create session until something stored
secret: 'thisIsASecret'
}));
app.use(express.static(path.join(__dirname, 'public')));
app.use(function (req, res, next) {
res.locals.csrfToken = req.csrfToken();
next();
});
app.get('/', /*csrfProtection,*/ function (req, res) {
res.render('index')
});
app.post('/process', parseForm, /*csrfProtection,*/ function (req, res) {
res.send('data is being processed')
});
Index.jade
meta(name="csrf-token", content="#{csrfToken}")
block content
input(type="hidden" name="_csrf" value="#{csrfToken}")
|Favorite color: <input type="text" name="favoriteColor">
button(type="submit" id="sbmt") Submit
script(src= "/javascripts/jquery-2.2.1.js")
script.
$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
var token;
if (!options.crossDomain) {
token = $('meta[name="csrf-token"]').attr('content');
if (token) {
return jqXHR.setRequestHeader('X-CSRF-Token', token);
}
}
});
$("#sbmt").click(function (e) {
e.preventDefault();
$.post(
"/process",
{
//text: text,
_csrf : $('meta[name="csrf-token"]').attr('content')
}, function (data) {
console.log(data);
});
});
正在调用 csrf()
returns 函数 (source)。您需要 use
才能拥有它。您在本教程中错过的是:
var csrfProtection = csrf({ cookie: true })
app.get('/form', csrfProtection, function(req, res) {
// pass the csrfToken to the view
res.render('send', { csrfToken: req.csrfToken() })
})
这里其实是调用了csrfProtection
,在req
的基础上增加了csrfToken
方法。在另一个例子中有:
app.use(csrf({ cookie: true }))
这意味着 所有 路由都将使用保护,因此 post 没有它是不可能的。
这取决于您的使用情况 - 如果您想保护所有路由 - 全局使用它 (app.use
),否则根据请求使用它(如第一个示例)。
如果您尝试在您的索引路由中使用它,您将拥有它,因为您已将它用作中间件:
app.get('/', csrfProtection, function (req, res) {
res.render('index')
});
您必须添加:
app.use(session({ ... });
// Add this after session
app.use(csrfProtection);
您需要按照说明在会话之后添加此内容 here:
If you are setting the "cookie" option to a non-false value, then you
must use cookie-parser before this module. Otherwise, you must use a
session middleware before this module. For example: express-session
cookie-session
我正在尝试在我的 NodeJS 应用程序中使用 csrf。
你可以看到下面的代码。当我 运行 此代码时,我收到 "TypeError: req.csrfToken is not a function" 错误。
我想为所有请求创建 csrf 令牌,并想在 ajax 调用中检查 csrf 令牌。正如我所说,我无法创建 csrf 令牌,我遇到了错误。另外,如何在 ajax 调用中检查 csrf 令牌?
你能帮帮我吗?
谢谢
服务器端:
var express = require('express');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var csrf = require('csurf');
var bodyParser = require('body-parser');
/*this line commented*/
//var csrfProtection = csrf({ cookie: false });
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
var parseForm = bodyParser.urlencoded({ extended: false });
app.use(cookieParser());
/*this line added*/
app.use(csrf({ cookie: false }));
app.use(session({
genid: function (req) {
return "lkgktktgjknvfndkj-dfgjnkdfkjgn-dfgdfg";
},
name: "mySecret",
resave: false, // don't save session if unmodified
saveUninitialized: false, // don't create session until something stored
secret: 'thisIsASecret'
}));
app.use(express.static(path.join(__dirname, 'public')));
app.use(function (req, res, next) {
res.locals.csrfToken = req.csrfToken();
next();
});
app.get('/', /*csrfProtection,*/ function (req, res) {
res.render('index')
});
app.post('/process', parseForm, /*csrfProtection,*/ function (req, res) {
res.send('data is being processed')
});
Index.jade
meta(name="csrf-token", content="#{csrfToken}")
block content
input(type="hidden" name="_csrf" value="#{csrfToken}")
|Favorite color: <input type="text" name="favoriteColor">
button(type="submit" id="sbmt") Submit
script(src= "/javascripts/jquery-2.2.1.js")
script.
$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
var token;
if (!options.crossDomain) {
token = $('meta[name="csrf-token"]').attr('content');
if (token) {
return jqXHR.setRequestHeader('X-CSRF-Token', token);
}
}
});
$("#sbmt").click(function (e) {
e.preventDefault();
$.post(
"/process",
{
//text: text,
_csrf : $('meta[name="csrf-token"]').attr('content')
}, function (data) {
console.log(data);
});
});
正在调用 csrf()
returns 函数 (source)。您需要 use
才能拥有它。您在本教程中错过的是:
var csrfProtection = csrf({ cookie: true })
app.get('/form', csrfProtection, function(req, res) {
// pass the csrfToken to the view
res.render('send', { csrfToken: req.csrfToken() })
})
这里其实是调用了csrfProtection
,在req
的基础上增加了csrfToken
方法。在另一个例子中有:
app.use(csrf({ cookie: true }))
这意味着 所有 路由都将使用保护,因此 post 没有它是不可能的。
这取决于您的使用情况 - 如果您想保护所有路由 - 全局使用它 (app.use
),否则根据请求使用它(如第一个示例)。
如果您尝试在您的索引路由中使用它,您将拥有它,因为您已将它用作中间件:
app.get('/', csrfProtection, function (req, res) {
res.render('index')
});
您必须添加:
app.use(session({ ... });
// Add this after session
app.use(csrfProtection);
您需要按照说明在会话之后添加此内容 here:
If you are setting the "cookie" option to a non-false value, then you must use cookie-parser before this module. Otherwise, you must use a session middleware before this module. For example: express-session cookie-session