首页 > 解决方案 > 使用 fetch API 发送 POST 请求时处理 csrf 安全性

问题描述

我正在为 Django/Python 网络应用程序实现网络通知。

要求之一是记录目标用户“接收通知”的行为。

为了记录这个指标,我使用了 fetch 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 令牌的对象。收到通知的用户可能不会打开 Web 应用程序。因此,我无法运行以下内容:

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();
}

为了避免这种情况,我不得不制作 server-side view csrf_exempt。我觉得这不是很安全。

所以我想问专家他们将如何处理这种场景的安全方面?

顺便说一句,这里的服务器端开发人员不得不涉足 JS 并且超出了他的深度。为菜鸟问题道歉(如果是的话)。

标签: javascriptservice-workerweb-notifications

解决方案


推荐阅读