在文档中描述了如何从CSRF保护中排除路由,但我希望将它们包括在内。有没有一种方法可以将CSRF令牌添加到隐藏字段中,它应该使用什么名称?
浏览源代码时,我只会看到添加到AJAX调用中的标头,这是否意味着与当前版本相比,常规POST调用无法保证安全?
答案 0 :(得分:0)
我们本可以允许使用隐藏字段,但隐藏字段的安全性不如标头,因为允许第三方网络钓鱼站点提交常规的POST表单,但不允许向请求添加HTTP标头。因此,标准保护以两种方式为您提供保护:(1)攻击者无法访问CSRF cookie,以及(2)攻击者无法添加标头,因为只有JavaScript可以添加标头,并且JavaScript受到相同的限制-来源政策。
因此,使用jQuery表单提交而不是“普通香草” POST是ApostropheCMS的最佳做法。
无论如何,jQuery表单提交都很容易,而且效果更好。不必为用户呈现一个全新的页面。
下面是一个简单的jQuery代码示例,用于增强普通的HTML形式:
$(function() {
var $myForm = $('.my-form');
$myForm.on('submit', function() {
$.post($myForm.attr('action'), $myForm.serialize(), function() {
// It worked, now display a thank you message, or navigate somewhere
}).fail(function() {
// An error was received, show the user a message etc.
});
// IMPORTANT: prevent the traditional submission
return false;
});
});
在这里,我从action属性中拉出将表单发布到的URL,但是您不必这样做,您可以使用设置为接收POST表单提交的任何URL。
请注意,我并没有做任何特别的事情来获得AJAX保护。只要您使用jQuery的AJAX机制(包括$.post
),ApostropheCMS就会自动使用它。
您可以在此处用代码填写我的成功和失败功能,以显示或隐藏页面中已嵌入的消息等。
编辑:以下是一种可行的解决方法,可以使其按您希望的方式工作。
// Browser-side JavaScript
$('form').each(function() {
$(this).append('<input type="hidden" name="xsrf-token" value="' + $.cookie(apos.csrfCookieName) + '" />');
});
现在,您可以在lib/modules/your-module/index.js
中提供中间件,以将该隐藏字段放在Apostrophe期望的位置:
self.expressMiddleware = {
when: 'beforeRequired',
middleware: function(req, res, next) {
if (!(req.body && req.body['xsrf-token'])) {
return next();
}
req.headers['X-XSRF-TOKEN'] = req.body['xsrf-token'];
return next();
}
};