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