【问题标题】:Safety of disabling CSRF protection for API acces in django在 django 中为 API 访问禁用 CSRF 保护的安全性
【发布时间】:2015-04-28 23:05:17
【问题描述】:

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

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

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

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

问题在于,由于没有要填写的表单,因此也没有 CSRF 令牌,并且 django 默认情况下不允许在没有它的情况下发送 POST 请求。

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

这可能是安全风险吗?如果有,怎么做?

【问题讨论】:

    标签: django django-csrf csrf-protection


    【解决方案1】:

    这无疑是一个安全风险,因为任何站点/脚本/机器人都可以发送将由您的后端处理的 POST 数据。

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

    如果您希望为用户/特定应用提供访问权限,那么您应该保留 CSRF 令牌和/或添加一些其他安全措施。

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

    然后对您的 API 的所有进一步请求(对于您设置的任何会话长度,因为 CSRF 令牌将在特定的未使用时间范围内过期)。只需发送带有 POST 数据的 CSRF 令牌(就像任何形式一样)。

    编辑:

    如果您使用标准 HTML,所有获取请求都将有一个包含 CSRFTOKEN 的标头“Set-Cookie”。因此,任何通过 HTTP 访问您的 API 的程序都可以获取该标头,从中解析 CSRFTOKEN,并将所有 POST 请求作为数据集的一部分返回。

    【讨论】:

    • 感谢您的回复!我对令牌处理有点困惑。我已经有了对用户进行身份验证的 API 代码,从这里借来的:forgottenlabs.com/how-to-authenticate-in-django-via-urllib2 让我感到困惑的是:进行 POST 时是否需要新的令牌?我可以重复使用从身份验证阶段获得的令牌吗?
    • 好吧,我想我可能已经明白了:我只用 {% csrf_token %} 填写了一个模板,我首先在 GET 请求中呈现了它。然后我解析令牌并将其包装在一个连续的 POST 请求中。它现在似乎工作了。
    • 感谢您的提示!现在我可以避免额外的请求 :) 将答案标记为已接受。
    猜你喜欢
    • 2010-12-19
    • 2020-07-07
    • 2016-01-21
    • 2021-12-24
    • 2011-11-27
    • 2021-08-09
    • 2012-06-28
    • 1970-01-01
    • 2018-03-09
    相关资源
    最近更新 更多