2011-08-10 40 views
1

我試圖完成以下行爲:的Django + APACHE:HTTPS只爲登錄頁面

當藉助該網站用戶訪問: http://example.com/ 我希望他被重定向到: https://example.com/

通過中間件,如果用戶未登錄,登錄模板在訪問/時呈現。如果用戶登錄,/是主視圖。當用戶登錄時,我想通過http工作。爲此,我在端口80和443上運行相同的服務器(這是否真的有必要?我給人的印象是,我運行兩個具有相同應用程序的獨立服務器,而我想要一個服務器監聽兩個端口)。

當用戶導航離開登錄時,由於重定向到http服務器,request.session中的數據不存在(儘管它存在於https上),因此表明沒有用戶登錄。所以,考慮到Apache的設置是正確的(在兩個不同的端口上運行相同的服務器),我想我必須將cookie從運行在https上的服務器傳遞到http。

有人可以對此有所瞭解嗎?謝謝

回答

0

首先確保設置SESSION_COOKIE_SECURE設置爲false。只要域名相同,瀏覽器上的cookies應該存在,所以會話信息應該仍然存在。

使用插件查看您的cookies。搜索您設置的會話cookie。默認情況下,這些cookie被Django命名爲「sessionid」。確保安全會話和常規會話的域和路徑實際上都是正確的。

但是我想對此發出警告。最近,Firesheep等公司已經利用了很長時間以來人們所瞭解但忽略的一個問題,即這些Cookie不具備任何安全性。對於某人來說,通過HTTP連接「嗅探」cookie並以登錄用戶的身份訪問網站將很容易。這從根本上消除了您建立安全連接首先登錄的所有原因。

是否有一個原因,您沒有整個網站的安全連接?有關服務器上更密集的傳統爭論實際上不再適用於現代CPU,而且我上面提到的漏洞已經變得非常流行,以至於加密所有流量的邊際成本(真的是邊際成本)是非常值得的。

Apache需要基本上有2個不同的服務器運行,因爲a)它在兩個不同的端口上偵聽,b)一個是添加一些額外的加密邏輯。這就是說這對Apache來說是正常的事情。我運行帶有幾十臺運行在不同端口上的「服務器」並執行不同邏輯的服務器。在事情的宏偉計劃中,這不應該減輕服務器的負擔。

這就是說,一旦您向* WSGI或mod_python傳遞相同的請求,您將不得不擁有邏輯來確保沒有人嘗試登錄您的非加密連接,因爲與Django唯一的區別將是request.is_secure()中的響應。您的urlconf中的所有URL和視圖都可以訪問。

這是很多。我希望有所幫助。

+0

謝謝你的回答。但是,如果我將SESSION_COOKIE_SECURE設置爲false,則在https模式下登錄不可用,因爲cookie不被接受,不是嗎? (我試過了,我無法登錄)。 我只使用https登錄,以避免以純文本和由於應用程序的一些必要條件發送密碼。順便說一句,其中一個原因就是在整個應用程序中使用https的強度。 我現在很好奇,就如何完成的第一個想法(因爲我已閱讀,雅虎郵件以這種方式運行) – rSkdA

+0

SESSION_COOKIE_SECURE是上一個cookie告訴瀏覽器設置一個標誌,只有通過安全連接發送cookie 。這是特別的,所以cookie不會被髮送到我們正在討論的問題上。它不應該影響你登錄到一個安全的網站。 – newmaniese

+0

以明文形式發送會話cookie與以明文形式發送密碼相同。所有授予的特權將是相同的。這是雅虎的一個主要問題,爲什麼我可以進入星巴克並登錄爲當前登錄到雅虎的任何人(或者Facebook或Twitter未通過安全連接)。 – newmaniese