CSRF验证失败,但仅限于IE9

时间:2011-09-16 08:16:24

标签: django csrf django-csrf

我按照Django docs(使用Django 1.3)中的描述设置了CSRF。它适用于FF和Safari,但在IE9上我得到了

<div id="summary">
<h1>Forbidden <span>(403)</span></h1>
<p>CSRF verification failed. Request aborted.</p>
</div>

在Ajax请求的响应头中,我找到了

Set-Cookie  csrftoken=8db3637951243ffb591e6b2d6998ed03; expires=Fri, 14-Sep-2012 08:01:52 GMT; Max-Age=31449600; Path=/

在普通表格中使用它时,它在IE9中有效(即不涉及Ajax)。

我在nginx / 1.1.2后面使用Django。

任何提示我在这里缺少什么?

3 个答案:

答案 0 :(得分:3)

如果您的表单位于iframe内,则可能的原因是IE的默认策略是阻止第三方Cookie。你可以

Django的机票#17157建议在文档中添加关于此问题的说明。

答案 1 :(得分:2)

我遇到了同样的问题,对我来说问题是我没有指定表单操作属性。 IE显然不允许这样做。

答案 2 :(得分:1)

在Django的门票#17157中(感谢@akaihola的链接),它表明问题在于Internet Explorer默认阻止第三方cookie。因此,您可以为所有网站启用第三方Cookie,或仅在浏览器设置中为您的网站启用第三方Cookie。 以下是如何在IE 7(来自this link)中执行此操作:

  1. 点击“工具”菜单
  2. 点击“互联网选项”
  3. 选择“隐私”标签
  4. 选项1:为所有网站启用第三方Cookie

    1. 点击“高级”
    2. 选择“覆盖自动Cookie处理”
    3. 选择“第三方Cookie”下的“接受”按钮,然后点击“确定”
    4. OR

      选项2:仅为Feedjit.com启用第三方Cookie

      1. 点击“网站”
      2. 添加“ your-domain.com ”并点击“允许”
      3. 点击“确定”
      4. 选择“第三方Cookie”下的“接受”按钮,然后点击“确定”