2012-03-30 28 views
5

我有一個自定義退出瀏覽。我已經添加了裝飾像下面應該我在Django的註銷視圖中使用@csrf_protect與中間件

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

@csrf_protect 
@require_POST 
@never_cache 
def logout(request): 
    nxt=request.POST.get('next') 
    print 'next=',nxt 
    return logout_then_login(request, nxt) 

在我的設置文件,我有以下中間件類一起

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
) 

由於CsrfViewMiddleware包含在這裏,我真的需要@csrf_protect用於我的視圖嗎?如果我同時使用,會不會有一些問題/衝突?

另外,當我檢查django source時,我發現裝飾器只適用於登錄視圖,而不適用於任何註銷,login_then_logout視圖。爲什麼?

任何幫助最歡迎的

回答

5

中間件爲您提供了所有視圖毛毯保護 - 加裝飾是多餘的。 Django文檔建議在裝飾器上使用中間件,因爲它提供了更好的保護。不建議

本身裝飾的使用,因爲如果你忘記 使用它,你將有一個安全漏洞。 '腰帶和括號' 使用這兩種策略都很好,並且會產生最小的開銷。

的裝飾不用於您提到的,因爲如果被觸發login_then_logout事件有一點要通過CSRF被劫持無會話風險的意見,不存在安全風險,用戶一次會話都有被摧毀。

你似乎有很多關於CSRF的問題 - 我可能會建議你在Django's CSRF documentation和CSRF general

+0

謝謝@Todd,作爲django和web開發的新手,我很努力地理解這些技術。我通過django源代碼瀏覽並經常感到困惑 – damon 2012-03-30 03:24:40

+1

@damon,我不會使用源代碼作爲指導框架。 Django的文檔是我使用過的最好的文檔之一(如果不是*最好的)。我肯定會閱讀網站上的Django教程,並將其與官方Django文檔的其餘部分進行補充。 – Todd 2012-03-30 03:27:15

相關問題