【问题标题】:Django CSRF protection for mobile apps and chrome extensions用于移动应用程序和 chrome 扩展的 Django CSRF 保护
【发布时间】:2014-03-06 06:42:55
【问题描述】:

我已经使用 django 作为我的后端做了一些移动应用程序,现在我正在开发一个 chrome 扩展。我希望我的用户能够使用应用程序/扩展将 POST 请求发送到服务器,但是有没有办法在不先向服务器询问 CSRF 令牌的情况下做到这一点?它只是让应用程序免于在每次我们要提交数据时发出两个请求。例如,我想在我的社交媒体应用程序上更新我的个人资料或从 chrome 扩展程序更新钱包。打开配置文件视图输入数据并将其推送到服务器会很好。如果我必须打开配置文件,然后等待它从服务器获取令牌,然后我可以提交数据,那就不那么时髦了。还有另一种方法可以做到这一点吗?还是每次我想提交数据时都无法发出多个请求?

另外,稍微澄清一下,CSRF 会阻止网站提交包含用户数据的表单。但是是什么阻止我创建一个使用 ajax 或其他东西来获取真实站点并窃取 CSRF 令牌然后将其粘贴到我的跨站点请求表单中的站点?我觉得这里有一个漏洞。我知道我一直不太了解这一点。

【问题讨论】:

    标签: django csrf django-csrf


    【解决方案1】:

    您可以而且应该免除任何 API 端点 CSRF。

    Django 为此提供了csrf_exempt 装饰器,请参阅https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#django.views.decorators.csrf.csrf_exempt

    CSRF 还旨在防止通过 GET 请求伪造执行意外操作。这并不是为了让自动化系统无法提交表单,这是有验证码的。

    至于阻止您使用 AJAX 获取整个站点并提取令牌的原因是 Same-Origin Policy。这是由浏览器实现的,并且当 AJAX 调用的目标是没有设置正确标头的不同域时,防止任何 AJAX 调用返回数据。 (我不完全确定什么沙盒应用于与此相关的 chrome 扩展)。因此,它将或至少应该无法通过 AJAX 获取普通网站的数据,例如个人资料页面。如果您想与第三方网站互动,您应该查看他们是否提供 API。

    【讨论】:

    • 所以使它成为 csrf_exempt 只是使它不需要 csrf 令牌?如果我将它用于应用程序的后端并且不提供实际页面,那么我不妨禁用中间件,对吗?我今天读了很多关于 csrf 的书(我以为我以前理解过,但显然没有)。可以说 CSRF 是为了防止人们制作一个试图获取用户会话的虚假网站吗?
    • CSRF 可用于会话固定攻击。但它也允许其他攻击。如果您只是创建 API,您确实可以删除 CSRF 中间件。相反,所有请求都应通过某种方式进行身份验证。例如。令牌或凭据。
    猜你喜欢
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 2011-09-03
    • 1970-01-01
    相关资源
    最近更新 更多