在什么情况下CSRF豁免是危险的?

时间:2012-03-31 13:39:42

标签: django csrf django-csrf csrf-protection

这个问题比直接关于如何编码的问题更像是一种再保险。作为一个自学者,我没有很多可能向专业人士询问这样的事情,所以我在这里尝试。

我已阅读django-docs(https://docs.djangoproject.com/en/1.3/ref/contrib/csrf/)中的文档以及该页面上的一些信息:http://cwe.mitre.org/top25/#CWE-352

据我所知,django向用户提供了一个令牌(某种代码)。为了验证它真的是他,他必须在下次提出请求时将其归还。谷歌的一些人发现,甚至可以通过ajax请求实现这一点,这就是为什么我们自1.2.6以来也有保护它们的新政策。 CSRF是关于某人给我一些东西(坏的,危险的代码,腐败的文件或类似的东西)假装成其他人。

所以,如果我有这样的代码:

@csrf_exempt    
def grab(request):
    """
    view to download an item
    POST because it stores that a user has downloaded this item
    """
    item_id = request.POST.get('item', None)
    if not loop: return HttpResponseBadRequest('no item id provided')
    item = Item.objects.get(pk=int(item_id))

应该保存,因为在尝试将给定值转换为整数之前,我没有访问数据库或应用程序的任何部分。如果我对某人下载文件的记录错误(在这种情况下几乎没有),则没有太多损害。假设我会根据这个观点编写账单,CSRF豁免会有不同的想法(是吗?)。

我也不明白为什么有人不能从用户那里窃取CSRF令牌并使用它来欺骗我(或用户)。所以我对这个话题有一些疑问:

1)是我上面的假设吗?

2)有人可以告诉我,一些不那么好的人可以使用上面的观点来做肮脏的伎俩(也可能是怎样),他们会是什么?

3)CSRF是一个中间人攻击的例子,它只是与它有关,还是完全不同?

4)进一步阅读这些危险的任何有价值的链接?

也许其中一些问题听起来不太明确,但我正试图克服这个问题。如果有人能帮助我,我会很高兴。

2 个答案:

答案 0 :(得分:9)

CSRF attacks是强制受害者浏览器发送伪造请求。一个简单的<img>或自动提交的<form>足以为GET和POST方法执行此操作。当请求由浏览器发送时,它会发送任何身份验证凭据,从而使请求看起来真实合法,从服务器的角度来看,因为它们基本上与用户操作发起的请求不同。

这正是CSRF令牌的用途:确定用户发起的请求与第三方站点伪造的请求之间的差异。为此,CSRF令牌充当仅供服务器和用户所知的秘密。服务器将文档中的秘密放入响应中,并期望在下一个请求中将其发回。

由于秘密嵌入在为此特定用户分配的响应文档中,因此攻击者需要窃听该特定响应或以其他方式访问该文档。肯定有攻击获得CSRF令牌(例如eavesdroppingMITMXSS等。但是,如果您受到这些攻击的保护,攻击者将无法伪造真实的请求。

答案 1 :(得分:7)

CSRF攻击

我诱骗您查看一个网页,其中我将一些代码(通常是imgform的请求)插入另一个网站(您可能拥有某些权利)。

无害的例子

<img src="http://www.yoursite.net/changelanguage?lang=fr">

我残酷地将你的会话语言改为法语。哦,不!您可以安全地删除csrf保护并保存数据库命中。

危险的例子

<img src="http://www.yourbank.net/sendmoney?amt=9999&account=123>

如果您在yourbank.net登录(并且没有csrf或任何其他保护),那么您的帐户现在应该感觉更轻松。 (我是123.)

<img src="http://www.yoursite.net/admin/users/123/edit?admin=1">

如果您以管理员身份登录yoursite.net,那么我们都是。 (我是123.)