2012-03-29 59 views
2

在讀取djangobook chapter時,我遇到了提到csrf漏洞的部分,其中註銷鏈接放在隱藏的惡意站點中。django使用鏈接或形式註銷,以防止csrf利用

在我創建使用Django的web應用程序,我已經使用了類似的註銷鏈接

base.html文件:

<a href="{% url my_logout %}" > Logout </a> 

其中my_logout URL指向​​

urlpatterns=patterns('django.contrib.auth.views', 
url(r'^logout/$', 'logout_then_login', {}, name = 'my_logout'), 
) 

現在在閱讀了csrf攻擊後,我擔心惡意網站也會給我帶來麻煩。所以,我想用一個表單來註銷。

我想我可以做這樣的

base.html文件:

... 

    <form method="post" action=".">{% csrf_token %} 
     <input type="hidden" name="next" value="{{next}}" /> 
     <input type="hidden" name="confirm" value="true" /> 
     <input type="submit" value="Logout" /> 
    </form> 
... 

現在,我應該怎麼寫處理這種形式如果我來處理隱變量(confirm的看法?檢查是否應該註銷,next轉到上一個視圖),我仍然可以使用​​方法嗎?

有人可以告訴我,如果我這樣做是正確的方式嗎?

在此先感謝

回答

3

你可以把它包像

from django.views.decorators.cache import never_cache 
from django.views.decorators.csrf import csrf_protect 
from django.views.decorators.http import require_POST 

@csrf_protect 
@require_POST 
@never_cache 
def safer_logout(request): 
    # 'confirm' is useless here, POST implies 'do it' 
    return logout_then_login(request, request.POST.get('next')) 

而且,考慮使用SESSION_COOKIE_HTTPONLY

+0

@ClaudeVedovini只覺得有人在快速打字時,我編輯它,哈= P – okm 2012-03-29 17:39:46

+0

我打算髮布幾乎相同的答案:) 無論如何,我會補充一點,我不認爲這是真正有用的。 CSRF漏洞被用來欺騙用戶完成他們登錄的應用程序中的操作,但強制他們註銷並沒有什麼意義。 – 2012-03-29 17:44:07

+0

@ClaudeVedovini是的,但有時當攻擊者打算暫時註銷你一段時間或等待你的新登錄程序 – okm 2012-03-29 17:52:25