首页 文章

快速CSRF令牌验证

提问于
浏览
4

我遇到CSRF令牌问题 . 当我提交表单时,会生成一个新的 XSRF-TOKEN 但我认为我有点困惑 . 还有一个名为 _csrf 的令牌,所以我在开发人员工具(XSRF-TOKEN和_csrf)中看到两个不同的cookie, _csrf 在帖子后没有变化 .

我想要做的是为每个帖子请求生成一个新令牌,并检查它是否有效 . 有一点我知道我应该为了安全而做,但我坚持了 .

这是漫长的一天,我是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(/表格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>

3 回答

  • 0

    根据您共享的代码量,有些事情看起来不正确:

    1 . 您可能需要交换这些行,以便csrf在路由之前运行 .

    app.use(app.router);
    app.use(csrf());
    

    2 . 这些线路需要放在路线之前 .

    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>
    
  • 7

    cookie中的令牌与快递会话中的令牌完全不同 . 你想检查一个或另一个不是两个 .

    我会完全禁用cookie!因为它对我有用 .

    var csrfProtection = csurf({cookie:false});

    作者在这里提到它https://github.com/expressjs/csurf/issues/52

    接下来你要_119235_到ajax帖子上的 Headers :Express.js csrf token with jQuery Ajax

  • 0

    下面的代码对我有用 . 如果您仍然面临问题,请告诉我 .

    如上所述,您希望使用cookie,您可以让csurf知道您使用cookie来设置CSRF令牌 .

    第1步:配置

    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>
    

相关问题