2012-03-01 88 views
4

我在項目中使用Django remote user authentication。我實際使用的僅僅是django.contrib.auth.RemoteUserBackend沒有中間件,並且在與後端檢查用戶是合法的後手動呼叫authenticateDjango遠程用戶認證和安全

讀取中間件的源代碼,它似乎只是從請求中的頭部獲取用戶名,然後通過傳遞此用戶名的後端對用戶進行身份驗證。遠程用戶後端反過來只是快樂地記錄用戶傳入的任何用戶名。用戶然後可以訪問需要有效登錄的每個區域。

這不就是一個巨大的安全漏洞嗎?這意味着如何使用?

在我來說,我應該是安全的,因爲到authenticate唯一的電話打進來一個成功的遠程身份驗證之後,但我想知道爲什麼引入中間件的原因。

回答

6

讓我來談談你:如果你認爲這是一個安全漏洞,那麼就嘗試編寫一個利用漏洞將REMOTE_USER標題設置到你的應用的請求中,並看看會發生什麼。

REMOTE_USER可以追溯到網頁的早期,當CGI頁面在本地執行時,就是您正在點擊網頁的用戶。 REMOTE_USER實際上是表示活動用戶的unix環境變量的名稱。隨着Web服務器的安全模型發生變化,此方案保留了兼容性。現在即使IIS支持它透明地處理Active Directory登錄。

所有用戶傳遞的標頭都以HTTP_開頭。否則,你不能相信任何頭信息,如SERVER_NAME,這將是一個巨大的混亂。

+0

感謝您解釋HTTP前綴! – Andrea 2012-05-22 08:16:36

1

Django'很高興地在'登錄用戶',因爲您的網絡服務器已檢查到訪問者具有該用戶名的有效憑據,並相應地設置標題。

如果您信任您的網絡服務器(例如Apache)正確設置REMOTE_USER(或其他)標頭,那麼這不是安全漏洞。

+0

我還是不明白。這只是請求的標題。爲什麼攻擊者在發出請求時不能手動設置它? – Andrea 2012-03-02 09:28:15

+0

Django依靠Web服務器正確設置標題。如果Web服務器允許用戶手動設置標題,那麼存在安全漏洞。 – Alasdair 2012-03-02 13:19:38

+0

我明白了,但重點是你必須以某種方式指示Web服務器從請求中刪除該標題。頭部大部分保持不變。它們是**請求**的一部分,因此它們是用戶輸入。我認爲這應該至少得到一個通知。 – Andrea 2012-03-02 13:39:53