3

Djangoで作成したアプリケーションをテストしているときに、フォームを送信するたびにHTTP403Forbiddenエラーがスローされることがわかりました。CSRFミドルウェアがCSRFトークンを使用してCookieをチェックすることは知っていますが、Cookieが無効になっているユーザーにどのようなアプローチを与える必要がありますか?

ユーザーが各ビューでCookieを有効にしているかどうかを確認する必要がありますか、それともより効率的な方法がありますか?

前もって感謝します。

この質問はDjangopre-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ミドルウェアを無効にする必要があると思います。1つの値がランダムで、もう1つが最初の1つとシークレットのハッシュである、2つのフォーム入力を使用して同様の何かを実装できる場合があります。

于 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 に答える