在 django 中为 API 访问禁用 CSRF 保护的安全性

Safety of disabling CSRF protection for API acces in django

(抱歉,如果这一切听起来微不足道,我是网络编程和 Django 的初学者)

我正在使用 Django 为科学测量数据库编写 Web 前端。

所需功能的一部分是使用户能够从网页向数据库提交新测量值。在 django 对 web 表单的出色支持的帮助下,我拥有了这项功能。数据通过受 CSRF 令牌保护的 POST 请求发送。

我现在正在开发相同的功能,但不是通过 Web 表单,而是通过 API 访问,这样用户就可以通过 Python 脚本批量提交新测量值,而无需每次手动填写网络表格。

这个问题是,因为没有表格要填写,所以也没有 CSRF 令牌,默认情况下 django 不允许发送 POST 没有它的请求。

目前,我已经通过使用 @csrf_exempt 装饰 API 视图解决了这个问题。但我并不真正理解这样做的安全隐患。

这会不会有安全风险?如果可以,怎么做?

这无疑是一种安全风险,因为任何 site/script/bot 都可以发送 POST 将由您的后端处理的数据。

如果您希望提供 public/anonymous API,那么它可能没问题,您只需要格外小心处理接收到的数据。

如果您希望提供 users/specific 应用程序访问权限,那么您应该保留 CSRF 令牌 and/or 添加一些其他安全措施。

使用 CSRF 令牌,您需要做的就是让系统的第一个请求成为 "GET" 对用户进行身份验证的请求(以您想要的任何方式),然后 return CSRF 令牌(或其他一些安全令牌,如果您想增强安全性)。

然后向您的 API 发出所有进一步的请求(无论您设置的 session 长度是多少,因为 CSRF 令牌将在特定的未使用时间范围内过期)。只需发送带有 POST 数据的 CSRF 令牌(就像任何表单一样)。

编辑:

如果您使用的是标准 HTML,所有获取请求都会有一个包含 CSRFTOKEN 的 Header "Set-Cookie"。因此,任何通过 HTTP 访问您的 API 的程序都可以获取 header,从中解析出 CSRFTOKEN,并在所有 POST 请求中 return 作为数据集的一部分。