5

私はDjangoとcsrfトークンを初めて使用するので、これはまったく新しい質問です。detail.htmlに簡単なチェックマークボックスがあります。

<form action="/results/" method="post">{% csrf_token %}
<input type="checkbox" value="1" name="artists">
<p><input type="submit" value="Send" /></p>
</form>

results.htmlは次のようになります。

<ul>
{% for choice in poll %}
    <li>{{ choice }} </li>
{% endfor %}
</ul>

views.pyは次のようになります:

from django.shortcuts import render_to_response
from django.core.context_processors import csrf

def handle(request):
    artists = {}
    c = {}
    c.update(csrf(request)) 
    if request.method == 'POST':
        artists = request.POST.getlist('artists')
    return render_to_response('polls/results.html', {'poll': artists})

urls.pyは次のようになります。

from django.conf.urls import patterns, url
from django.conf import settings

urlpatterns = patterns('',
    url(r'^detail/$', 'django.views.generic.simple.direct_to_template', {'template': 'polls/detail.html'}),
    url(r'^results/$', 'polls.views.handle'),
)

'detail.html'とviewsourceをロードすると、次のように表示されます。

<form action="/results/" method="post"><div style='display:none'><input type='hidden' name='csrfmiddlewaretoken' value='TVidKbDr1SCJUWIMWpPecN5tR862Chbo' /></div>
<input type="checkbox" value="1" name="artists">
<p><input type="submit" value="Send" /></p>
</form>

2つの質問があります:

  1. ビューソースにcsrfトークンを表示することになっていますか(つまり、value ='TVidKbDr1SCJUWIMWpPecN5tR862Chbo')?全体のポイントは、攻撃者がこの独自の価値を理解できないようにすることだと思いました。
  2. views.pyで、変数「c」をどこかに渡すことになっているのではないですか?'c'を渡さないと、すべてが期待どおりに機能します。使い方がわからない。
4

2 に答える 2

6
  1. いいえ、目的は攻撃者が値を見ることができないようにすることではありません。CSRF(Cross-Site Request Forgery)は、その名前が示すように、サードパーティのサイトまたはクライアントがフォームハンドラービューに匿名でデータを投稿するのを防ぐことを目的としています。CSRFトークンはページの読み込み時に生成され、フォームの送信時に応答ビューで一致する必要があります。サードパーティのエンティティが一致するコードを提供する方法はありません(Djangoで内部的に生成されるため)。したがって、フォームを投稿することはできません。これが非表示フィールドであるという事実は、ユーザーが知る必要も変更する必要もない情報であるため、ユーザーに表示されないようにするためのものです。あなたのサイトを攻撃しようとするのに十分な知識を持っている人なら誰でも、ソースを表示する方法も知っているので、それがあらゆる種類の保護のためであるという考えは狂気です。

  2. そのコードをどこから取得したかはわかりませんが、そもそも不要です。Djangoのデフォルトの動作は、CSRFトークンをコンテキストに追加することです。ビューを条件付きcsrf_exemptでCSRF保護する必要があるため、デコレータを使用してビューのCSRF保護を無効にした場合にのみ、手動で行う必要があります。ただし、それを行う必要がある場合は、 :に渡されるコンテキストに変数を追加する必要があります。crender_to_response

    c = {'poll': artists}
    c.update(csrf(request)
    
    ...
    
    return render_to_response('polls/results.html', c)
    
于 2012-08-29T20:27:36.267 に答える
2
  1. はい、そういうわけで隠されたフィールドです
  2. こちらをご覧ください
于 2012-08-29T20:07:24.130 に答える