使用Django csrf_exempt查看Android GCM注册。最佳做法?

时间:2012-12-01 05:11:21

标签: android django security push-notification csrf

在Android GCM(推送通知服务)注册过程中,我的移动客户端必须向 Django视图发出 POST请求。 默认情况下,视图需要csrf_token,但 @csrf_exempt装饰器可能禁用

我的问题是:没有csrf检查视图有什么后果?如果我从移动客户端编写令牌(带有某种盐)会有意义吗?

2 个答案:

答案 0 :(得分:2)

这实际上取决于你的观点的性质。

csrf令牌可以帮助防止在已经在同一台PC上进行身份验证时调用您不想要的操作。例如,您的Django应用http://www.example.com/person/delete/356中存在一个URL,当您向其发送POST时,该URL将删除ID为356的人。这可能是正常的,因为它需要身份验证才能触发它。但是,如果您在一个选项卡中登录了Django应用程序,并且有人向您发送包含链接“http://www.example.com/person/delete/356”的网络钓鱼邮件(或类似邮件),那么该怎么办?它,因为你已经在另一个选项卡中进行了身份验证。通过让Django期望一个csrf令牌,Django只会转到它实际上期望的动作请求 - 即Django知道它发出了令牌“12345ab”,因此当一个带有令牌“12345ab”的请求被返回时它的罚款就行动了,如果它丢失了或者你发送“98765zx”它会失败。阅读更多关于Django csrf令牌here以及Wikipedia上的跨站点请求伪造

如果您没有身份验证且视图没有执行任何操作(即它不会更改数据,则只显示它),那么制作@csrf_exempt的风险非常低。

同样,如果这是在移动应用程序中发生并且视图已经过身份验证,那么不会在应用程序之间共享身份验证,因为它与浏览器选项卡一样,因此风险很低。

您还有其他选项可用,如果您可以以某种方式获得预期的csrf令牌,那么在设置HTTP请求时您可以设置标头,就像在AJAX调用期间一样,阅读Django文档here

答案 1 :(得分:1)

这取决于许多因素,特别是您在注册ID之外收集的内容,以及客户端如何连接到服务器以进行POST。

没有CSRF验证的GCM注册的最坏情况

攻击者可以将自己控制的设备注册到受害者的帐户,并接收针对受害者的通知。

根据你正在做的事情,这可能不是那么可怕,特别是考虑到这一点 GCM消息不应该包含任何敏感信息,只是作为在更安全的方法下加载信息的触发器。

(即,如果GCM触发在客户端设备中加载基于身份验证的新页面的活动,因为攻击者的应用程序不会使用受害者的凭据进行身份验证,他们无法看到敏感信息。)< / p>

它比其他任何东西都更令人讨厌。

如果你想防止这个

  1. 将令牌设置为Nam提及 - 如果您从服务器启动GCM注册活动(即从JavaScript回调),只需设置客户端需要通过注册传回的令牌。 CSRF请求将与此步骤异步,并且由于缺少令牌而将失败。

  2. 如果您的应用通过应用独有的子域与服务器通信(例如,app.site.com在子域级别使用auth cookie),只要应用程序专门加载您自己的域(即没有外部网站),并且服务器只允许访问该子域的注册视图,它很难被利用。 CSRF攻击可能会在浏览器中发生。

  3. 使用CookieManager从应用程序中的站点cookie中提取CSRF豁免值,并将其作为POST变量添加到请求中。然后您不需要使视图CSRF免除。这基本上是Django处理AJAX CSRF的方式。请务必在注册前使用@ensure_csrf_cookie装饰器,以确保在客户端设置CSRF cookie。

  4. 结论

    老实说,GCF注册的CSRF对于“让你夜不能寐的问题”图腾极点非常低。 CSRF在帐户管理中更是一个问题(例如更改密码,进行银行交易等)。

相关问题