2010-01-11 27 views
10

當使用@login_required修飾器並設置LOGIN_URL變量時,我發現了一種信息泄漏形式。Django:使用@login_required並設置LOGIN_URL時出現信息泄露問題

我有一個網站,需要所有內容的強制登錄。問題在於,當它是現有頁面時,您將使用下一個變量集重定向到登錄頁面。

所以當沒有登錄和要求:

http://localhost:8000/validurl/ 

你看這個:

http://localhost:8000/login/?next=/validurl/ 

,並要求一個不存在的頁面時:

http://localhost:8000/faultyurl/ 

您看到這一點:

http://localhost:8000/login/ 

這揭示了一些我不想要的信息。我想重寫登錄方法,迫使下一個空,並在這個子類方法上調用「超級」。

另一個問題是,我的一些測試失敗,沒有設置LOGIN_URL。他們重定向到'/ accounts/login /'而不是'/ login /'。因此,爲什麼我想使用LOGIN_URL,但禁用了「auto next」功能。

任何人都可以對這個問題有所瞭解?

非常感謝。

傑拉德。

+0

國際海事組織,這是半正確的行爲。對於不存在的資源,您應該返回404,對於需要授權查看的現有資源,您應該返回403。換句話說,你不應該直接進入不存在的東西的登錄頁面 - 顯示一個非常空的404頁面。 – 2010-01-11 15:18:55

回答

5

您可以在urls.py文件中包含此行作爲最後一個模式。它將重新路由不匹配任何其他模式的網址到登錄頁面。

urlpatterns = patterns('', 

    ... 

    (r'^(?P<path>.+)$', 'django.views.generic.simple.redirect_to', { 
     'url': '/login/?next=/%(path)s', 
     'permanent': False 
    }), 
) 

編輯:爲了不斷提高404頁,以驗證的用戶,請執行下列操作:

from django.http import Http404, HttpResponseRedirect 
def fake_redirect(request, path): 
    if request.user.is_authenticated: 
     raise Http404() 
    else: 
     return HttpResponseRedirect('/login/?next=/%s' % path) 

urlpatterns = patterns('', 

    ... 

    (r'^(?P<path>.+)$', fake_redirect), 
) 
+0

jbochi,有趣的解決方案。但是,這會爲正常登錄的人終止正常的404行爲。我必須檢查自定義404處理程序的影響程度。它檢查是否有人登錄,然後決定404或登錄。我看到一個循環出現在那裏:) – GerardJP 2010-01-11 14:41:49

+0

@GerardJP。你是對的!我編輯了我的答案。請參閱第二個解決方案。如果你願意,你可以修改'raise Http404()'這行來調用你的自定義404處理程序。 – jbochi 2010-01-11 15:00:15

+0

jbochi,太棒了!這確實是我正在尋找的那個。目前我選擇放鬆我的測試,並禁用LOGIN_URL,因爲它是由我的404處理程序處理的。否則,我只爲一個我不使用的變量實現一些代碼,除了它打破了我的測試。但我絕對會記得'抓住所有'網址技巧。再次感謝! – GerardJP 2010-01-12 14:35:58

相關問題