【问题标题】:Django on Apache with mod_wsgi CSRF Verification Failed带有 mod_wsgi CSRF 验证的 Apache 上的 Django 失败
【发布时间】:2016-02-05 15:45:24
【问题描述】:

我在 Apache 上有一个带有 mod_wsgi 的 Django 站点。起初管理页面会返回一个 500 错误,它在重新启动 Apache 等后开始工作。但是现在当我登录时,我收到一条 403 并显示以下消息:

CSRF verification failed. Request aborted.
You are seeing this message because this site requires a CSRF cookie when submitting forms. This cookie is required for security reasons, to ensure that your browser is not being hijacked by third parties.
If you have configured your browser to disable cookies, please re-enable them, at least for this site, or for 'same-origin' requests.

我的设置中唯一的 CSRF 选项是 CSRF_COOKIE_DOMAIN = "127.0.0.1"

CSSRF_SECURE_DOMAIN 未设置,因此默认为 False。我目前根本没有使用 https,因为该网站仍在开发中。

但我需要能够访问管理界面。

如何解决此错误?在本地开发服务器上一切正常,但一旦推送到 Web 服务器,我就遇到了这些类型的问题。

那么,有人对我遇到的这个 CSRF 验证错误有什么建议吗?如果我必须在网站上实施 SSL,有人知道它会如何改变吗?

所有请求/响应都来自同一台服务器。感谢提供的任何帮助。

编辑:

在我的 Django 记录器文件输出中,我得到了这一行:

[04/Nov/2015 18:13:20] WARNING [django.request:98] Forbidden (CSRF cookie not set.): /sa-admin/login/

说CSRF cookie根本没有设置。但是我使用默认的 contrib.admin 来处理所有这些,所以我对这个问题感到困惑。只有西装已添加到管理员。但这只是一个皮肤。

【问题讨论】:

  • 您是否创建了自己的 html 模板来访问管理页面?
  • @shenk,因为您在我回答完最后一个问题后删除了它,所以您应该注意您必须重新启动 Apache 才能重新加载您的代码!进行更改时,请记住重新启动 Apache 进行测试。此外,在您的设置中启用 DEBUG,这样您就不必依赖 Apache 错误日志。
  • 不只是使用内置的管理模块
  • 管理员是唯一受影响的页面吗?
  • 是的似乎是。但我没有任何其他页面使用 CSRF 进行登录以进行检查。我的表格还没有完全完成,所以我无法检查。

标签: python django apache csrf


【解决方案1】:

您应该从您的设置中删除CSRF_COOKIE_DOMAIN = "127.0.0.1"

Django 正在使用您的生产域寻找 CSRF 令牌 cookie,但由于您的设置,您的应用程序将 127.0.0.1 设置为 cookie 域,因此找不到它。因此它返回 HTTP 403 并记录未设置 cookie。

【讨论】:

  • 试图删除它,但它似乎没有任何区别。有什么我应该用它代替的吗?
  • 生产域的名称。如果您将其保留为“无”,它也将起作用,因为它是此设置的默认值。
  • 不,在标准情况下,您根本不应该设置此设置,将其保留为默认值None。是的,您应该重新启动 Apache。此设置可以允许执行来自其他子域的 POST 请求,这不是标准情况。见docs.djangoproject.com/en/1.8/ref/settings/#csrf-cookie-domain
  • 是的,你绝对可以。
猜你喜欢
  • 2012-09-08
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
  • 2011-06-14
相关资源
最近更新 更多