快速 CSRF 令牌验证
Express CSRF token validation
我在使用 CSRF 令牌时遇到问题。当我提交表单时,会生成一个新的 XSRF-TOKEN
,但我想我生成了两个不同的标记,我有点困惑。还有一个名为 _csrf
的令牌,所以我在开发人员工具中看到两个不同的 cookie(XSRF-TOKEN 和 _csrf),_csrf
在 post 之后没有改变。
我想做的是为每个 post 请求生成一个新的令牌并检查它是否有效。有一件事我知道为了安全我应该这样做,但我坚持了。
这是漫长的一天,我是 Express 和 NodeJS 的新手。
这是我当前的设置。
var express = require('express')
, passport = require('passport')
, flash = require('connect-flash')
, utils = require('./utils')
, csrf = require('csurf')
// setup route middlewares
,csrfProtection = csrf({ cookie: true })
, methodOverride = require('method-override')
, bodyParser = require("body-parser")
, parseForm = bodyParser.urlencoded({ extended: false })
, cookieParser = require('cookie-parser')
, cookieSession = require('cookie-session')
, LocalStrategy = require('passport-local').Strategy
, RememberMeStrategy = require('../..').Strategy;
var app = express();
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.engine('ejs', require('ejs-locals'));
app.use(express.logger());
app.use(express.static(__dirname + '/../../public'));
app.use(cookieParser());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(methodOverride());
app.use(express.session({ secret: 'keyboard cat' }));
app.use(flash());
// Initialize Passport! Also use passport.session() middleware, to support
// persistent login sessions (recommended).
app.use(passport.initialize());
app.use(passport.session());
app.use(passport.authenticate('remember-me'));
app.use(app.router);
app.use(csrf());
app.use(function (req, res, next) {
res.cookie('XSRF-TOKEN', req.csrfToken());
res.locals.csrftoken = req.csrfToken();
next();
});
路线
app.get('/form', csrfProtection, function(req, res) {
// pass the csrfToken to the view
res.render('send', { csrfToken: req.csrfToken()});
});
app.post('/process', parseForm, csrfProtection, function(req, res) {
res.send('data is being processed');
});
send.ejs (/form GET)
<form action="/process" method="POST">
<input type="hidden" name="_csrf" value="<%= csrfToken %>">
Favorite color: <input type="text" name="favoriteColor">
<button type="submit">Submit</button>
</form>
根据您分享的代码量,我会提到一些我觉得不太合适的地方:
1。您可能需要交换下面的行,以便 csrf 在路由之前运行。
app.use(csrf());
app.use(app.router);
2。 csrftoken 设置也需要放在路由之前。
app.use(csrf());
app.use(function (req, res, next) {
res.cookie('XSRF-TOKEN', req.csrfToken());
res.locals.csrftoken = req.csrfToken();
next();
});
app.use(app.router);
3。您需要在表单中使用 locals.csrftoken
:
<form action="/process" method="POST">
<input type="hidden" name="_csrf" value="<%= csrftoken %>">
Favorite color: <input type="text" name="favoriteColor">
<button type="submit">Submit</button>
</form>
cookie 中的标记将与 express 中的标记完全不同 session。你想检查一个或另一个而不是两者。
我会完全禁用 cookie!因为它对我有用。
var csrfProtection = csurf({ cookie: false });
作者在这里提到了
https://github.com/expressjs/csurf/issues/52
接下来您要 "X-CSRF-Token" 到 ajax 上的 header post 在这里找到:
Express.js csrf token with jQuery Ajax
下面的代码对我有用。如果您仍然遇到问题,请告诉我。
如前所述,您希望使用 cookie,您已让 csurf 知道您正在使用 cookie 来设置 CSRF 令牌。
第一步:配置
var csrf = require('csurf');
var cookieparser= require('cookie-parser');
//cookieparser must be placed before csrf
app.use(bodyparser.urlencoded({extended:false}));
app.use(cookieParser('randomStringisHere222'));
app.use(csrf({cookie:{key:XSRF-TOKEN,path:'/'}}));
//add the your app routes here
app.use("/api", person);
app.use("/", home);
第二步:在路线中,
res.render('myViewPage',{csrfTokenFromServer:req.csrfToken()});
第 3 步:在 HTML 中为 csrf 令牌包含一个隐藏字段示例:
<form action="/api/person" method="POST">
<input type="hidden" name="_csrf" value=<%=csrfTokenFromServer %> />
First name:<br>
<input type="text" name="firstname" value="">
<br>
Last name:<br>
<input type="text" name="lastname" value="">
<br><br>
<input type="submit" value="Submit">
</form>
我在使用 CSRF 令牌时遇到问题。当我提交表单时,会生成一个新的 XSRF-TOKEN
,但我想我生成了两个不同的标记,我有点困惑。还有一个名为 _csrf
的令牌,所以我在开发人员工具中看到两个不同的 cookie(XSRF-TOKEN 和 _csrf),_csrf
在 post 之后没有改变。
我想做的是为每个 post 请求生成一个新的令牌并检查它是否有效。有一件事我知道为了安全我应该这样做,但我坚持了。
这是漫长的一天,我是 Express 和 NodeJS 的新手。
这是我当前的设置。
var express = require('express')
, passport = require('passport')
, flash = require('connect-flash')
, utils = require('./utils')
, csrf = require('csurf')
// setup route middlewares
,csrfProtection = csrf({ cookie: true })
, methodOverride = require('method-override')
, bodyParser = require("body-parser")
, parseForm = bodyParser.urlencoded({ extended: false })
, cookieParser = require('cookie-parser')
, cookieSession = require('cookie-session')
, LocalStrategy = require('passport-local').Strategy
, RememberMeStrategy = require('../..').Strategy;
var app = express();
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.engine('ejs', require('ejs-locals'));
app.use(express.logger());
app.use(express.static(__dirname + '/../../public'));
app.use(cookieParser());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(methodOverride());
app.use(express.session({ secret: 'keyboard cat' }));
app.use(flash());
// Initialize Passport! Also use passport.session() middleware, to support
// persistent login sessions (recommended).
app.use(passport.initialize());
app.use(passport.session());
app.use(passport.authenticate('remember-me'));
app.use(app.router);
app.use(csrf());
app.use(function (req, res, next) {
res.cookie('XSRF-TOKEN', req.csrfToken());
res.locals.csrftoken = req.csrfToken();
next();
});
路线
app.get('/form', csrfProtection, function(req, res) {
// pass the csrfToken to the view
res.render('send', { csrfToken: req.csrfToken()});
});
app.post('/process', parseForm, csrfProtection, function(req, res) {
res.send('data is being processed');
});
send.ejs (/form GET)
<form action="/process" method="POST">
<input type="hidden" name="_csrf" value="<%= csrfToken %>">
Favorite color: <input type="text" name="favoriteColor">
<button type="submit">Submit</button>
</form>
根据您分享的代码量,我会提到一些我觉得不太合适的地方:
1。您可能需要交换下面的行,以便 csrf 在路由之前运行。
app.use(csrf());
app.use(app.router);
2。 csrftoken 设置也需要放在路由之前。
app.use(csrf());
app.use(function (req, res, next) {
res.cookie('XSRF-TOKEN', req.csrfToken());
res.locals.csrftoken = req.csrfToken();
next();
});
app.use(app.router);
3。您需要在表单中使用 locals.csrftoken
:
<form action="/process" method="POST">
<input type="hidden" name="_csrf" value="<%= csrftoken %>">
Favorite color: <input type="text" name="favoriteColor">
<button type="submit">Submit</button>
</form>
cookie 中的标记将与 express 中的标记完全不同 session。你想检查一个或另一个而不是两者。
我会完全禁用 cookie!因为它对我有用。
var csrfProtection = csurf({ cookie: false });
作者在这里提到了 https://github.com/expressjs/csurf/issues/52
接下来您要 "X-CSRF-Token" 到 ajax 上的 header post 在这里找到: Express.js csrf token with jQuery Ajax
下面的代码对我有用。如果您仍然遇到问题,请告诉我。
如前所述,您希望使用 cookie,您已让 csurf 知道您正在使用 cookie 来设置 CSRF 令牌。
第一步:配置
var csrf = require('csurf');
var cookieparser= require('cookie-parser');
//cookieparser must be placed before csrf
app.use(bodyparser.urlencoded({extended:false}));
app.use(cookieParser('randomStringisHere222'));
app.use(csrf({cookie:{key:XSRF-TOKEN,path:'/'}}));
//add the your app routes here
app.use("/api", person);
app.use("/", home);
第二步:在路线中,
res.render('myViewPage',{csrfTokenFromServer:req.csrfToken()});
第 3 步:在 HTML 中为 csrf 令牌包含一个隐藏字段示例:
<form action="/api/person" method="POST">
<input type="hidden" name="_csrf" value=<%=csrfTokenFromServer %> />
First name:<br>
<input type="text" name="firstname" value="">
<br>
Last name:<br>
<input type="text" name="lastname" value="">
<br><br>
<input type="submit" value="Submit">
</form>