此开源聊天项目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
答案 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
对象扩展模板范围,这就是在模板化过程中填充该字段的方式。