Javascript 在NodeJS中使用CSRF
Javascript 在NodeJS中使用CSRF,javascript,ajax,node.js,express,csrf,Javascript,Ajax,Node.js,Express,Csrf,我正在尝试在我的NodeJS应用程序中使用csrf。 您可以看到下面的代码。当我运行这段代码时,我得到了“TypeError:req.csrfToken不是函数”错误。 我想为所有请求创建csrf令牌,并想在ajax调用中检查csrf令牌。正如我所说,我不能创建csrf令牌,我得到了错误。另外,如何在ajax调用中检查csrf令牌? 你能帮我吗? 谢谢 服务器端: var express = require('express'); var cookieParser = require('cook
我正在尝试在我的NodeJS应用程序中使用csrf。 您可以看到下面的代码。当我运行这段代码时,我得到了“TypeError:req.csrfToken不是函数”错误。
我想为所有请求创建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')
});
翡翠索引
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);
});
});
meta(name=“csrf-token”,content=“#{csrfToken}”)
块内容
输入(type=“hidden”name=“_csrf”value=“#{csrfToken}”)
|最喜欢的颜色:
按钮(type=“submit”id=“sbmt”)提交
脚本(src=“/javascripts/jquery-2.2.1.js”)
剧本
$.ajaxPrefilter(函数(选项、原始选项、jqXHR){
var代币;
如果(!options.crossDomain){
令牌=$('meta[name=“csrf-token”]')。attr('content');
如果(令牌){
返回jqXHR.setRequestHeader('X-CSRF-Token',Token);
}
}
});
$(“#sbmt”)。单击(功能(e){
e、 预防默认值();
美元邮政(
“/进程”,
{
//文本:文本,
_csrf:$('meta[name=“csrf-token”]').attr('content')
},函数(数据){
控制台日志(数据);
});
});
调用csrf()
返回一个函数()。你需要使用它才能拥有它。您在本教程中错过的是:
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
,它将csrfToken
方法添加到req
。在另一个例子中,有:
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);
您需要在会话后添加以下内容:
如果将“cookie”选项设置为非假值,则
在此模块之前必须使用cookie解析器。否则,您必须使用
此模块之前的会话中间件。例如:快速会话
cookie会话
您好,我评论了这一行://var csrfProtection=csrf({cookie:false});我添加了app.use(csrf({cookie:false}));cookieparser之后的会话使用之前。我删除了路由中的csrfProtection用法。这次它给了我“配置错误的csrf”错误。我编辑了我的代码,给了我“配置错误的csrf”错误。谢谢你,Michelem,它正在神奇地工作。你的帮助真的很有价值。我编辑了我的代码,给了我“配置错误的csrf”错误。好吧,用谷歌搜索一下!!!这不是一个走我通过类型的论坛。你问了什么,就会得到回应。如果你有其他问题,你会不断地问新问题。如果能付出一些努力并开始阅读文档,那将是一件好事。嗨,Andrey,你是对的,我收到了回复,但回复不足以成功运行我的代码。所以根据你的回答,我稍微修改了我的代码,我发现了她的错误。此外,我花了一整天的时间阅读了很多论坛,以实现我的想法。经过努力,我在stackoverflow中提出了我的问题。所以我想我在问这个问题之前已经尽了最大的努力。(顺便说一句,我对Node和csrf非常熟悉)无论如何,谢谢你的指导