1

私の GET リクエストのほとんどは Angular によって起動されるため、ヘッダーに CSRF トークンを簡単に設定できます。これは、POST リクエストに対してはすぐに使用できますが、GET リクエストに対しても CSRF 保護を使用できるかどうか疑問に思っていました。

私の最初の本能は@csrf_protect、ビューの get メソッドの前に追加することでした。たとえば、次のようになります。

class ProjectView(View):
    @csrf_protect
    def get(self, request, *args, **kwargs):
        ...

ただし、これによりエラーが発生します。

AttributeError at /project
'ProjectView' object has no attribute 'COOKIES'

File "c:\Apps\msysgit\simpletask\lib\site-packages\django\middleware\csrf.py" in process_view
  95.                 request.COOKIES[settings.CSRF_COOKIE_NAME])

だから私は、GETリクエストが提供しないPOSTリクエストが提供するものがあると推測しています。これを行うより良い方法はありますか?

また、すべての機密情報は POST リクエストを介して取得する必要があると誰かが言及する前に (最近何度か目にしたように)、GET に固執しようとする理由は、RESTful ガイドラインに従って構築しようとしているからです。つまり、GET リクエストです。はデータのプル用、POST は新しいレコード用、PUT は更新用、DELETE はデータの削除用です。

編集

私が上記のことを試みるべきではないという意見があるように思われるので、私はある程度同意しますが、私が防止しようとしている悪用については、次の 3 つのリンクで説明されています。

4

2 に答える 2

4

使用する必要がありますmethod_decorator

https://docs.djangoproject.com/en/1.4/topics/class-based-views/#decorating-the-class

だからあなたのコードは

class ProjectView(View):`
    @method_decorator(csrf_protect)
    def get(self, request, *args, **kwargs):

[編集] ただしcsrf_protect、POST リクエストのみをチェックします (`if request.method == 'POST' チェックがあります)。そのため、独自に何かを実装する必要があります。

于 2013-04-02T04:07:19.550 に答える