javascript - 在 NodeJS 中使用 CSRF

标签 javascript ajax node.js express csrf


我正在尝试在我的 NodeJS 应用程序中使用 csrf。 你可以看到下面的代码。当我运行这段代码时,出现“TypeError: req.csrfToken is not a function”错误。

我想为所有请求创建 csrf token ,并想在 ajax 调用中检查 csrf token 。正如我所说,我无法创建 csrf token ,我遇到了错误。另外如何在 ajax 调用中检查 csrf token ?

你能帮帮我吗?
谢谢

服务器端:

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')
});

索引.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);
                });
        });

最佳答案

你必须添加:

app.use(session({ ... });
// Add this after session
app.use(csrfProtection);

您需要按照说明在 session 之后添加 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

关于javascript - 在 NodeJS 中使用 CSRF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36442919/

相关文章:

javascript - Websockets-多种消息类型

javascript - 选择不带 TR 的表 TD

javascript - 如何在由框架创建的 &lt;input&gt; 标记中显示不 chop 的文本

javascript - Ajax.beginform回调属性,无法理解差异

php - 如何处理 AJAX 爬虫的 ?_escaped_fragment_=?

android - Firebase Cloud Function 在特定时间后自动删除数据

javascript - 如何创建不能用作构造函数的函数

javascript - 认为我的 ajax 有问题吗?

node.js - 复合服务器 8888 失败并显示 "failed to connect to [localhost:27017]"

javascript - 如何在聊天中对消息进行分组,而不是将每条新消息放在一个新部分中?