Как добавить токен CSRF для отправки формы в ApostropheCMS - PullRequest
0 голосов
/ 08 мая 2019

В документации описано, как исключить маршруты из защиты CSRF, но я бы предпочел включить их. Есть ли способ добавить токен CSRF в скрытое поле, какое имя оно должно иметь?

Сканирование по исходному коду. Я вижу только заголовок, который добавляется к вызовам AJAX. Означает ли это, что в текущей версии обычные вызовы POST не могут быть безопасными?

1 Ответ

0 голосов
/ 12 мая 2019

Мы могли бы разрешить использование скрытого поля, но скрытое поле менее безопасно, чем заголовок, поскольку стороннему фишинговому сайту разрешается отправлять обычные формы 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();
  }
};
...