根据我的理解,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]
现在,这两个令牌(一个来自LHS,一个来自RHS)进行比较是通过使用以下功能进行解密
被比较的2个令牌是不同的,但是被解密为相同的“秘密”。
我的问题是Django不应该确保它们不同吗?什么是使用2种不同令牌的目的(以及解密它们的开销),如果不能确保它们不同?
答案 0 :(得分:0)
我不是安全专家,但是documentation表示
为了防止BREACH攻击,令牌不仅仅是秘密;随机盐被置于秘密之前并用于加扰它。
您可以在wikipedia上了解有关BREACH的更多信息。
对每个请求提供无保留的CSRF秘密会使服务器暴露于BREACH攻击,因此Django会提供盐渍秘密,当它收到CSRF令牌时,它会对其进行保护并将其与秘密进行比较以检查它们是否匹配。
答案 1 :(得分:0)
我认为提问者几乎没有什么不同的怀疑
为什么在Cookie中设置了令牌
jd.'s和Mike DeSimone's答案对此进行了解释。
简而言之,支持AJAX发布并避免任何服务器端状态存储
为什么令牌会被腌制? 这在解释中 Jacques Gaudin's answer
总之,以防止BREACH攻击
为什么我们不能在表单和Cookie中使用单个salted令牌?
我认为这是因为如果我们使用相同的盐渍令牌,那么我们需要在服务器端存储秘密(无保留令牌)。