Обработка безопасности csrf при использовании API fetch для отправки запроса POST - PullRequest
1 голос
/ 04 апреля 2019

Я реализую веб-уведомления для веб-приложения Django / Python.

Одним из требований является регистрация акта «получения уведомления» целевым пользователем.

Для регистрации этой метрики я использую API выборки, например:

function log_notif_reception(status_code) {

  fetch('/1-on-1/push-notif/received/', {
    "method": 'POST',
    "headers": {
      'Accept': 'application/json',
      'Content-Type':'application/json'
    },
    "credentials": 'include',
    "body": JSON.stringify({'status_code':status_code})

  })
  .then(function(response) {
    if (!response.ok) {
      throw new Error('Bad status code from server.');
    }
  });

}

Это достаточно просто.

Проблема в том, что view на стороне сервера, которая находится на приемной стороне этого запроса POST, ожидает csrf token, чтобы гарантировать, что это не атака Cross-Site Request Forgery.

Однако в этом сценарии нет объекта document, из которого я мог бы извлечь токен csrf. Пользователь, получающий уведомление, вероятно, не сможет открыть веб-приложение. Ergo, я не могу запустить что-то вроде следующего:

function get_cookie(name) {
  if (!name) { return null; }
  var value = "; " + document.cookie;
  var parts = value.split("; " + name + "=");
  if (parts.length >= 2) return parts.pop().split(";").shift();
}

Чтобы обойти это, мне пришлось сделать вид со стороны сервера csrf_exempt. Я чувствую, что это не очень безопасно.

Итак, я хотел спросить экспертов, как они справятся с аспектами безопасности сценария, подобного этому?

Кстати, серверный разработчик, которому пришлось поболтать в JS и находится вне его глубины. Извиняюсь за вопрос нуба (если он есть).

...