我正在尝试以 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/