Django如何验证CSRF?

时间:2018-04-05 16:57:28

标签: python django csrf csrf-protection django-csrf

根据我的理解,Django验证CSRF的方式是通过比较

request.POST.get('csrfmiddlewaretoken', '') | request.META.get(settings.CSRF_HEADER_NAME, '') == request.session.get(CSRF_SESSION_KEY) | request.COOKIES[settings.CSRF_COOKIE_NAME]

CsrfViewMiddleware

现在,这两个令牌(一个来自LHS,一个来自RHS)进行比较是通过使用以下功能进行解密

_unsalt_cipher_token

被比较的2个令牌是不同的,但是被解密为相同的“秘密”

我的问题是Django不应该确保它们不同吗?什么是使用2种不同令牌的目的(以及解密它们的开销),如果不能确保它们不同?

2 个答案:

答案 0 :(得分:0)

我不是安全专家,但是documentation表示

  

为了防止BREACH攻击,令牌不仅仅是秘密;随机盐被置于秘密之前并用于加扰它。

您可以在wikipedia上了解有关BREACH的更多信息。

对每个请求提供无保留的CSRF秘密会使服务器暴露于BREACH攻击,因此Django会提供盐渍秘密,当它收到CSRF令牌时,它会对其进行保护并将其与秘密进行比较以检查它们是否匹配。

答案 1 :(得分:0)

我认为提问者几乎没有什么不同的怀疑

  1. 为什么在Cookie中设置了令牌

    jd.'sMike DeSimone's答案对此进行了解释。

    简而言之,支持AJAX发布并避免任何服务器端状态存储

  2. 为什么令牌会被腌制? 这在解释中 Jacques Gaudin's answer

    总之,以防止BREACH攻击

  3. 为什么我们不能在表单和Cookie中使用单个salted令牌?

    我认为这是因为如果我们使用相同的盐渍令牌,那么我们需要在服务器端存储秘密(无保留令牌)。