Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在NodeJS中使用CSRF_Javascript_Ajax_Node.js_Express_Csrf - Fatal编程技术网

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非常熟悉)无论如何,谢谢你的指导