2014-03-18 28 views
0

我在教程看到例如code如下列:是csrf需要在視圖中還是在模板中有足夠的django?

def login_view(request): 
     c={} 
     c.update(csrf(request)) 
     return render(request,'login.html',c) 

    def login_view(request): 
     return render(request,'login.html') 

在模板文件中,我有csrf_token聲明。

{% extends "base.html" %} 
{% block content %} 
{% if form.errors %} 
    <p class="error"> sorry, not a valid username or password </p> 
{% endif %} 

<form action="/accounts/auth/" method="post">{% csrf_token %} 
<label for="username"> UserName:</label> 
<input type="text" name="username" value="" id="username"> 
<label for="password"> Password:</label> 
<input type="password" name="password" value="" id="password"> 
<input type="submit" value="login"> 
</form> 

{% endblock %} 

我的問題是csrf是否需要存在於兩端(當renderview以及在template)。 render沒有csrfview工作正常。但我想知道最佳做法。我正在使用Django 1.6.2

回答

1

它必須出現在template以防止cross-site request forgery但在view中不需要。 這只是我的看法,我可能是錯的。

1

您需要刪除此行「c.update(csrf(request))」,因爲您在這裏有一個重要的安全漏洞,csrf標記應該只從html表單發送,但是如果您將csrf包含在在html表單中視圖請求令牌被忽略(即使它不存在),這就是您的視圖在您的表單中使用和不使用csrf令牌的原因。

0

你不需要做任何特別的事情。只要你有

MIDDLEWARE_CLASSES =(..., 'django.middleware.csrf.CsrfViewMiddleware',...)

在你的settings.py

(這是默認值),您的模板將有權訪問{%csrf_token%}標記。您不需要像在您的示例視圖方法中那樣手動將其設置在模板上下文中。

相關問題