在表单中获取csrf标记

时间:2014-01-05 19:10:08

标签: javascript node.js

此开源聊天项目https://github.com/meatspaces/meatspace-chat使用下面的jade索引文件。您会注意到表单具有#{csrf}标记的输入值。这个csrf值来自哪里?它是浏览器环境的一部分吗?我没有在项目中看到任何将该csrf标记插入该输入字段的javascript。

例如,当您访问root时,它只是像这样呈现索引

  app.get('/', function (req, res) {
    res.render('index');
  });

索引

extend layout

block content
  form(method='post', id='add-chat-form')
    input(type='hidden', name='picture', id='picture')
    .message-content
      input(name='message', id='add-chat', class='input', maxlength='250', autocomplete='off', placeholder='Send a public message')
      input(type='hidden', name='_csrf', value='#{csrf}')
      input(type='hidden', name='fingerprint', id='fp')
      input(type='hidden', name='userid', id='userid')
      #add-chat-blocker.hidden
        span Sending, please wait!
  #counter 250

1 个答案:

答案 0 :(得分:0)

令牌由connect csrf middleware创建。您可以在settings.js中看到此信息。第7行:

  var csrf = express.csrf();

和第13行:

  var clientBypassCSRF = function (req, res, next) {
    if (req.body.apiKey && nativeClients.indexOf(req.body.apiKey) > -1) {
      next();
    } else {
      csrf(req, res, next);
    }
  };

这会在csrfToken对象上公开函数req,该函数在第45行使用:

        res.locals.csrf = req.csrfToken();

快速模板引擎(在您的问题中显示的代码中为res.render('index');)使用res.locals对象扩展模板范围,这就是在模板化过程中填充该字段的方式。