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

时间:2014-01-20 11:47:26

标签: node.js express csrf

我正在尝试在快递中生成CSRF令牌。我检查了相关的查询,但似乎没有人帮助我。我的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令牌被设置,我也收到了禁止的消息

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)

知道为什么我会收到禁止访问。

1 个答案:

答案 0 :(得分:0)

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

例如,如果你使用swig,那么你应该用花括号包裹它,如下所示:

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

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