在测试我用 Django 编写的应用程序时,我发现每次提交表单时都会抛出 HTTP 403 Forbidden 错误。我知道 CSRF 中间件使用 CSRF 令牌检查 cookie - 但是我的方法应该为禁用 cookie 的用户提供什么?
我是否需要检查用户是否在我的每个视图中启用了 cookie,或者是否有更有效的方法?
提前致谢。
这个问题涉及 Django pre-1.2——如果你有旧版本,解决方案会有所不同。
仅适用于遇到相同问题的任何人:我发现最适合我的解决方案是编写一些显示通用 403 错误页面的中间件:
from django.http import HttpResponseForbidden
from django.conf import settings
from django.template import RequestContext
from django.shortcuts import render_to_response
class PermissionErrorMiddleware(object):
def process_response(self, request, response):
if isinstance(response, HttpResponseForbidden):
return render_to_response('403.html', context_instance=RequestContext(request))
return response
它指示用户错误页面的最可能原因是 cookie 被禁用(除其他外),因为我的应用程序并没有真正抛出 403 错误。我一直更喜欢“通过默默无闻的安全”方法,当用户不应该访问特定页面时抛出 404 错误。
从 Django 1.2 开始,您可以使用CSRF_FAILURE_VIEW覆盖 403 响应。
如果表单真的必须在没有 cookie 的情况下工作,我认为您只需要禁用 CSRF 中间件。您也许可以使用两个表单输入来实现类似的东西,其中一个的值是随机的,另一个是第一个的哈希值和一个秘密。
您是否尝试将 csrf 信息作为隐藏的 POST 变量传递?在我参与的项目中,通常使用隐藏的输入来完成:
<input type="hidden" name="csrf" value="<?=$person->csrf?>" />
抱歉 PHP 代码,我不记得如何在 Django 模板中做到这一点。