我是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>
我有两个问题:
答案 0 :(得分:4)
不,目的不是让攻击者看不到价值。顾名思义,CSRF(跨站点请求伪造)旨在防止第三方站点或客户端匿名向表单处理程序视图发布数据。 CSRF令牌是在页面加载时生成的,在提交表单时必须在响应视图中进行匹配。第三方实体无法提供匹配代码(因为它是在Django内部生成的),因此,它无法发布表单。它是隐藏字段的事实仅仅是因为它不是呈现给用户,因为它是他们不需要知道或改变的信息。任何知道足以试图攻击您网站的人都知道如何查看来源,这种想法是任何形式的保护都是精神错乱。
我不确定你从哪里挑选代码,但首先没有必要。 Django的默认行为是将CSRF令牌添加到上下文中。如果您使用csrf_exempt
装饰器在视图上禁用了CSRF保护,则只需手动执行此操作,因为您需要CSRF保护视图有条件地。但是,如果您确实需要这样做,则需要将c
变量添加到传递给render_to_response
的上下文中:
c = {'poll': artists}
c.update(csrf(request)
...
return render_to_response('polls/results.html', c)
答案 1 :(得分:2)