2012-03-31 55 views
10

这个问题比直接关于如何编码的问题更重要。作为一个autodidact我没有太多的可能性问专业人士这样的事情,所以我在这里尝试。在什么情况下可以免于CSRF的危险?

我已阅读在Django的文档文件(https://docs.djangoproject.com/en/1.3/ref/contrib/csrf/),并在该网页上的一些信息:http://cwe.mitre.org/top25/#CWE-352

至于我也明白了,Django的提供了一个令牌(某种PIN码)到用户。为了验证它确实是他,他必须在他下一次请求时返回它。谷歌的一些人发现,这甚至可能发生在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)任何有价值的链接进一步阅读这些危险?

也许这些问题中的一些听起来没有太明智的信息,但我试图克服。如果有人能帮助我,我会很高兴。

回答

9

CSRF attacks是关于迫使受害者浏览器发送伪造的请求。简单的<img>或自动提交<form>就足够为GET和POST方法做到这一点。而且,由于请求是由浏览器发送的,因此它会发送任何认证凭证,从服务器的角度来看,这些请求看起来是真实且合法的,因为它们与用户操作发起的请求基本没有区别。

这正是CSRF令牌的用途:确定由用户发起的请求与由第三方站点伪造的请求之间的区别。为此目的,CSRF令牌用作服务器和用户只知道的秘密。服务器将秘密放在文档中作为响应,并希望在下一个请求中发回。

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

+0

隧道尽头出现一道昏暗的光......所以如果我想把邪恶的东西传送给服务器,我首先必须向某些用户浏览器发送一些数据。在这个数据中,我隐藏了一些自动发送表单发送到服务器进行攻击。我假设用户登录到该服务器,因为他有一个帐户。如果服务器不检查某个标记,它只需要相信该请求是合法的。至少我现在有一个想法,它是如何工作的,以及在哪里画MIM和XSS。感谢那。 – marue 2012-03-31 17:38:22

+0

@marue CSRF不是将恶意数据发送到服务器。这主要是因为攻击网站可以代表受害者发送合法和真实的请求。窃听,MITM和XSS只是获取缓解CSRF令牌的手段(尽管由于大多数身份验证管理方案使用基于cookie的会话,所以您可以改为使用会话ID)。 – Gumbo 2012-03-31 20:32:51

+0

因此CSRF是假装成为你不是的人的所有和“唯一”的?凡只意味着不重要,但其他一切都是不同的攻击媒介。 – marue 2012-03-31 23:37:17

6

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.)

+1

非常有帮助有这些例子,谢谢。 – marue 2015-09-27 11:25:54