2012-09-01 81 views
8

我正在第一次進入金字塔安全模塊。我使用這個登錄密碼設置auth_tkt:Pyramid.security問題:雙曲奇餅?餅乾不安全?過期?

@view_config(route_name='LoginForm', request_method='POST', renderer='string') 
class LoginForm(SimpleObject): 
    def __call__(self): 

     emailAddress = self.request.params.get('emailAddress') 
     password = self.request.params.get('password') 

     if emailAddress != '[email protected]' or password != 'testpassword': 
      errorDictionary = { 'message' : "Either the email address or password is wrong." } 
      self.request.response.status = 400 
      return json.dumps(errorDictionary, default=json_util.default) 

     testUserGUID = '123123123' 

     headers = remember(self.request, testUserGUID) 
     return HTTPOk(headers=headers) 

看來工作正常,但也有一些令人費解的細節:

首先,2塊餅乾真正得到設定,而不是一個。這兩個cookie是相同的(都使用名稱「auth_tkt」),除了一個區別:一個主機值爲「.www.mydomain.com」,而另一個cookie的主機值爲「www.mydomain.com」爲什麼是2個餅乾被設置而不是一個?差異主機價值的重要性是什麼?

問題2,網絡工具報告這兩個cookie都不安全。我能做些什麼來確保cookie是安全的?

問題3:這兩個cookie的過期值均爲「會話結束時」。這是什麼意思,我怎樣才能自定義到期價值?登錄Cookie到期時間的建議做法是什麼?

問題4:我不明白爲什麼「remember」的第一個參數是self.request而不是self.request.response。不應該在響應對象上記住數據,而不是請求對象?

+0

推測你的意思是'serverUserGUID ='1123123123'';你用這個變量名稱來調用'remember'。 –

+0

謝謝你......我修正了錯誤。 – zakdances

回答

11
  1. 實際上,生成3個cookie;一個沒有Domain鍵,一個沒有,並且第三個與你的域的通配符版本(最前面的點)。您的瀏覽器通常會合並這兩個或忽略其中一個(哪一個不同於瀏覽器,這就是設置2的原因)。

    當在AuthTktAuthenticationPolicy上設置wild_domain選項時,會生成最後的cookie(默認爲true);請參閱AuthTktAuthenticationPolicy API。如果您的身份驗證Cookie要在不同的子域之間共享(請考慮app1.domain,app2.domain);您的瀏覽器不會在沒有通配符cookie的情況下跨子域共享Cookie。

  2. 您需要在您的身份驗證策略中設置secure選項才能獲取安全標誌。再次請參閱API

  3. 未設置過期時間,這意味着當您關閉瀏覽器(瀏覽器顯示給您的會話結束)時,Cookie將被刪除。如果您希望用戶在關閉瀏覽器時註銷,請將其保留爲默認值。

    只有如果你想會話跨瀏覽器關閉最後,設置cookie最大的年齡,看到APImax_age選項。該選項將導致瀏覽器將cookie存儲在磁盤上以在瀏覽器關閉之間保留,並在最大年齡過去時將其刪除。

    請注意,AuthTktAuthenticationPolicy策略對象可以通過限制認爲任何認證cookie有效的時間長度,以更精細的方式管理登錄會話,並允許您設置Cookie刷新策略。有了這樣的刷新策略,用戶在繼續使用您的應用程序時將收到新的(刷新的)Cookie,但是如果他們沒有在一段時間內連接到您的服務器,他們的cookie將被認爲是無效的,他們會再次登錄。

    有關如何配置該選項的更多詳細信息,請參見API documentation中的timeoutreissue_time選項。

  4. 策略對象需要來自請求的幾條信息才能生成cookie,而不僅僅是服務器的所有主機名。

+1

感謝您的澄清。我想知道的一件事是,AuthTKTAuthentication策略是否可以抵禦csrf攻擊?如果不是,我們如何才能使其安全。還有一件事我們如何將它用於連接到客戶端移動應用程序的服務器。我想,餅乾事情會很困難。而不會令牌選項更好? –

+1

將'http_only'設置爲'True'告訴瀏覽器隱藏JavaScript中的Cookie;這使CSRF攻擊竊取cookie無效。 Cookie只是HTTP標頭,您的移動客戶端必須像管理任何其他網站一樣管理它們。不明白令牌選項的含義。 –

+0

我不確定這是否會阻止csrf攻擊,cookie會自動附加到對其設置域的任何請求。 Csrf攻擊就是這樣做的。我正在詢問有關創建令牌並向客戶端提供服務的問題,服務器會記住向特定用戶發佈的令牌。 –