8

CSRF保護を行うには、POSTメソッドを使用するフォームが必要ですか?私は本を​​フォローしていますが、コード例は403エラーをスローします。検索を行ったところ、すべてのフォームでCSRFを有効にする必要があるようです。

私の質問は次のとおりです。

  1. Djangoでは、すべてのPOSTフォームをCSRFから保護する必要がありますか?

  2. これを実現するために必要なのは、「django.middleware.csrf.CsrfViewMiddleware」を追加し、render_to_response(template、dictionary、context_instance = RequestContext(request)を返し、対応するフォームに「{%csrf_token%}」を追加することだけですか?ここに何かが足りませんか?

これを行うと、フォームは正常に機能します。これらのピースのいずれかが欠落している場合、403に失敗します。正しく実行していることを確認したいだけです。:)

前もって感謝します。

編集:

何らかの理由で、このコードは私には意味がありませんが、エラーは返されません。まだそれを行うためのより効率的な方法を示している本のセクションに到達していないので、原始的な検証を無視してください。

def contact(request):
    errors = []

    if request.method == 'POST':
        if not request.POST.get('subject',''):
            errors.append('Enter a subject')
        if not request.POST.get('message',''):
            errors.append('Enter a message')
        if request.POST.get('email', '') and '@' not in request.POST['email']:
            errors.append('Enter a valid email address')
        if not errors:
            send_mail(
                request.POST['subject'],
                request.POST['message'],
                request.POST.get('email', 'noreply@example.com'), ['siteownder@example.com'],)
            return HttpResponseRedirect('/contact/thanks/')

    return render_to_response('contact_form.html', { 'errors': errors }, context_instance=RequestContext(request))

私の問題は、このビュー関数の最後の行にあります。request.method!=POSTの場合にのみ呼び出されます。これは私には完全に間違っているようです。POSTを実行しているときに「context_instance=RequestContext(request)」を呼び出すべきではありませんか?

4

1 に答える 1

15

パスワードなどの機密情報には POST を使用する必要があり、django では csrf_token で保護する必要があります。GET は、検索など、保護する必要のないブックマーク可能なものに使用する必要があります。あなたはそれを正しくやっています。

編集

context_instance=RequestContext(request)を実行しているときに呼び出すべきではありませんPOST。リクエストの種類に関係なく呼び出す必要があります。次のように見てください。

  • それはPOSTですか?これは、フォームが送信されたことを意味します。フォームを検証し、フォームに問題がない場合はユーザーを別のページにリダイレクトするか、ユーザーにフォームを再度表示します
  • それはGETですか?これは、フォームが送信されなかったことを意味しますが、私たちが気にしない他のことが起こっています (リファラー リンクやその他のもの)。とにかくフォームを表示する

斜体のアクションは、if に関係なく、最後の return までに実行されます。

于 2010-08-25T22:05:31.653 に答える