Мы могли бы разрешить использование скрытого поля, но скрытое поле менее безопасно, чем заголовок, поскольку стороннему фишинговому сайту разрешается отправлять обычные формы POST, но не разрешается добавлять заголовки HTTP к запросам. Таким образом, стандартная защита охватывает вас двумя способами: (1) злоумышленник не может получить доступ к файлу CSRF и (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;
});
});
Здесь я извлекаю URL для POST формы из атрибута action, но вам не нужно этого делать, вы можете использовать любой URL, настроенный для получения отправки формы POST.
Обратите внимание, что я не делал ничего особенного, чтобы получить здесь защиту AJAX. Пока вы используете механизмы JJuery 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
, вы можете предоставить промежуточное программное обеспечение для размещения этого скрытого поля там, где его ожидает Апостроф:
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();
}
};