11

这个问题更像是一种再保险,而不是直接关于如何编码的问题。作为一个自学者,我没有太多机会向专业人士询问此类问题,所以我在这里尝试。

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

据我了解,django 向用户提供了一个令牌(某种密码)。为了验证它真的是他,他必须在下次他提出请求时归还它。Google 的一些人发现这甚至可以通过 ajax-requests 实现,这就是为什么我们从 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)任何有价值的链接可以进一步阅读这些危险?

也许其中一些问题听起来不太了解,但我正在努力克服这一点。如果有人可以帮助我,我会很高兴。

4

2 回答 2

10

CSRF 攻击是关于强制受害者浏览器发送伪造请求。对于 GET 和 POST 方法,一个简单的<img>或自动提交<form>的就足够了。由于请求是由浏览器发送的,它会发送任何身份验证凭据,从而使请求从服务器的角度来看是真实和合法的,因为它们基本上与用户操作发起的请求没有区别。

这正是 CSRF 令牌的用途:在用户发起的请求和第三方站点伪造的请求之间建立区别。为此,CSRF 令牌充当只有服务器和用户知道的秘密。服务器将秘密放入文档中的响应中,并期望在下一个请求中将其发回。

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

于 2012-03-31T16:16:01.117 回答
8

CSRF 攻击

我诱骗您查看我在其中插入一些代码(请求,通常通过imgor form)到另一个站点(您可能拥有某些权利)的网页。

无害的例子

<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 岁。)

于 2015-08-07T02:56:46.783 回答