3

在测试我用 Django 编写的应用程序时,我发现每次提交表单时都会抛出 HTTP 403 Forbidden 错误。我知道 CSRF 中间件使用 CSRF 令牌检查 cookie - 但是我的方法应该为禁用 cookie 的用户提供什么?

我是否需要检查用户是否在我的每个视图中启用了 cookie,或者是否有更有效的方法?

提前致谢。

这个问题涉及 Django pre-1.2——如果你有旧版本,解决方案会有所不同。

4

4 回答 4

1

仅适用于遇到相同问题的任何人:我发现最适合我的解决方案是编写一些显示通用 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 错误。

于 2009-12-06T11:35:43.963 回答
1

从 Django 1.2 开始,您可以使用CSRF_FAILURE_VIEW覆盖 403 响应。

于 2011-03-07T18:02:05.157 回答
0

如果表单真的必须在没有 cookie 的情况下工作,我认为您只需要禁用 CSRF 中间件。您也许可以使用两个表单输入来实现类似的东西,其中一个的值是随机的,另一个是第一个的哈希值和一个秘密。

于 2009-11-28T18:59:06.023 回答
0

您是否尝试将 csrf 信息作为隐藏的 POST 变量传递?在我参与的项目中,通常使用隐藏的输入来完成:

<input type="hidden" name="csrf" value="<?=$person->csrf?>" />

抱歉 PHP 代码,我不记得如何在 Django 模板中做到这一点。

于 2009-12-06T10:29:30.627 回答