node.js - 使用csrf(express + node)时禁止访问

标签 node.js express csrf

我正在尝试以 Express 方式生成 CSRF token 。我检查了相关查询,但似乎没有一个对我有帮助。我的 app.js 中有以下代码

var app = express();
var connect = require('connect');
// Disable CSRF for some requests
var conditionalCSRF = function (req, res, next) {
    var whitelist = ['/login'];

    if (req.method !== 'POST') {
        next();
        return;
    }
    if (whitelist.indexOf(req.url) !== -1) {
        next();
    } else {
        //req.session._csrf || (req.session._csrf = connect.utils.uid(24));
        (express.csrf())(req, res, next);
    }
};

app.configure(function() {
    app.use(passport.initialize());
    app.use(express.bodyParser()); 
    app.use(express.cookieParser());
    app.use(passport.session());
    app.use(express.session({ 
        secret: 'applecake',
        key: 'sid',
        cookie : {
            maxAge : 604800,
            path:"/"
        }
    }));
    app.use(conditionalCSRF);
    app.use(app.router);
    app.use(express.errorHandler());
});

我的表单是这样的简单表单

<form action="http://localhost:3000/conversationlist" method="post">

<div>
    <input type="hidden" name="_csrf" value=token />
</div>

<div>
    <input type="submit" value="Get ConversationList"/>
</div>

我使用/login URI 登录,并且工作正常,这不属于 CSRF 保护的一部分。一旦我尝试任何其他 URI,

我没有看到 CSRF token 被设置,而且我还收到一条禁止消息

Express
 403 Error: Forbidden
at Object.exports.error (C:\Career\Node.JS\ExpressCHLogging\node_modules\express\node_modules\connect\lib\utils.js:63:13)
at createToken (C:\Career\Node.JS\ExpressCHLogging\node_modules\express\node_modules\connect\lib\middleware\csrf.js:82:55)
at C:\Career\Node.JS\ExpressCHLogging\node_modules\express\node_modules\connect\lib\middleware\csrf.js:54:7
at Object.ondone (C:\Career\Node.JS\ExpressCHLogging\node_modules\express\node_modules\connect\node_modules\uid2\index.js:46:8)

知道为什么我收到禁止访问的信息吗?

最佳答案

确保您的 token 变量可用于渲染引擎。

例如,如果您使用 swig,那么您应该用大括号将其括起来,如下所示:

<input type="hidden" name="_csrf" value={{ token }} />

您可以通过在浏览器中打开表单并查看页面源代码来确保正确生成 token 。如果 csrf 值已正确分配,它将显示在 token 的位置,否则将为空。

关于node.js - 使用csrf(express + node)时禁止访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21233235/

相关文章:

debugging - 如何在轨迹测试中保留 session 和 CSRF token

javascript - 在 AWS Lambda 中使用异步关键字

sql-server - nodejs mssql 和 promise 混淆

node.js - 在开发环境中使用 Vue.js 热重载服务器 + Node 服务器进行 Passport.js 身份验证时出现问题

node.js - AngularJS + ExpressJS。代理 POST 请求待处理

node.js - res.sendFile 绝对路径

php - 如何防止自动 AJAX 攻击

node.js - Omnis Studio 10.2 31315 中嵌入了哪个版本的 node.js

javascript - Node.js 错误 : [Error: Query is required]

javascript - CSRF Token通过Postman不提交表单是否可以获取数据