【问题标题】:In what case can CSRF-exempt be dangerous?在什么情况下 CSRF-exempt 是危险的?
【发布时间】:2012-04-14 22:17:03
【问题描述】:

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

我已阅读 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) 有任何有价值的链接可以进一步阅读此类危险吗?

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

【问题讨论】:

    标签: django csrf django-csrf csrf-protection


    【解决方案1】:

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

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

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

    【讨论】:

    • 隧道尽头出现了一道昏暗的灯光......所以如果我想将邪恶的东西发送到服务器,我首先必须将一些数据发送到某些用户浏览器。在这些数据中,我隐藏了一些发送到服务器以被攻击的自动发布表单。我假设用户登录到该服务器,因为他在那里有一个帐户。如果服务器不检查某个令牌,它只需要相信该请求是合法的。至少我现在知道它是如何工作的,以及在哪里划清 MIM 和 XSS 的界限。谢谢你。
    • @marue CSRF 不是向服务器发送恶意数据。它主要是关于冒充,因为攻击站点可以代表受害者发送合法和真实的请求。窃听、MITM 和 XSS 只是获取缓解 CSRF 令牌的手段(尽管由于大多数身份验证管理方案使用基于 cookie 的会话,您也可以获取会话 ID)。
    • 所以 CSRF 就是“唯一”关于假装自己不是的人? where only 并不意味着不重要,但其他一切都是不同的攻击向量。
    • Gumbo,marue 的代码危险吗?我们想要一个明确的答案,你是什么意思“但是如果你受到保护免受这些攻击,攻击者将无法伪造一个真实的请求。”谢谢
    • @LucasOu-Yang 针对 CSRF 的保护需要一些不能伪造的东西,比如不可预测的参数(即 CSRF 令牌)。现在,如果攻击者能够通过窃听、MITM 或 XSS 获取此参数,他将能够伪造包含该不可预测参数的真实请求。现在,如果您受到保护免受这些攻击,攻击者将无法伪造真实请求,因为他无法预测 CSRF 令牌。
    【解决方案2】:

    CSRF 攻击

    我诱骗您查看我将一些代码(通常通过imgform)插入到另一个站点(您可能拥有某些权限)的网页。

    无害的例子

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

    我残忍地将您的会话语言更改为法语。哦不!您可以安全地移除 csrf 保护并保存 db hit。

    危险的例子

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      • 2012-11-18
      • 2012-01-13
      • 2013-05-06
      • 2021-01-01
      • 2015-03-08
      相关资源
      最近更新 更多