2011-12-19 97 views
9

時遇到的問題,這可能不是解決的,如下:保護cookie和session

我有一個客戶是在7-8不同位置的大型組織1,500+用戶。該應用程序是一個基於Kohana v3.0框架構建的PHP應用程序。該組織位於ISP級別的代理過濾服務器後面。每個位置都有一個主要的公共IP地址,然後通過代理渠道到網絡。每個用戶都有一個僱主發佈的Mac或Windows工作站。

他們正在經歷的事情似乎是cookie碰撞。示例:一個用戶在其工作站上登錄,然後另一個用戶使用相同的操作系統和瀏覽器類型從相同的位置,不同的工作站登錄。第二個用戶通過接收與第一個用戶匹配的新生成的cookie(令牌)來接收第一個用戶的活動會話。這似乎只與'authautologin'cookie相關(當記住我的複選框在登錄屏幕上進行設置時),但我保持我的選項對代理緩存(我無法證明代理仍在緩存)。

由於網絡設置,服務器可以看到數百個用戶使用相同的用戶代理從相同的IP地址登錄。我最初的想法是,Kohana v3生成瀏覽器(用戶代理)獨有的cookie的方式對於這個真實世界的應用程序來說並不足夠。

有沒有人遇到過這樣的事情?在Cookie和會話生成中採取適當的行動是什麼?管理數據庫中的Cookie和活動會話會更好嗎?

  • Kohana的模塊:果凍-AUTH,果凍,和驗證

  • 服務器:Apache/2.2.9(Debian的)的mod_fastcgi/2.4.6的mod_jk/1.2.26 PHP/5.2.6-1 + lenny8用了Suhosin貼片的mod_ssl/2.2.9的OpenSSL/0.9.8g

  • 已知的瀏覽器:IE 8 & 9,火狐(OS和Win)和Safari(OS)

+0

+1:仔細提問 - 有詳細的可用信息。做得好。 – 2011-12-19 16:15:28

+0

我同意,但這不是代理的問題,將適用於任何使用自動登錄cookie的服務? – 2011-12-19 16:17:40

+0

@皮卡一直是我上週的想法/沮喪。然後,在問他們的內部IT人員後,我瞭解到代理過濾器的目的是阻止像GMail,Facebook,Twitter等網站......所以我導致他們無法訪問網站之外的網站他們登錄的網絡。這個應用程序可能是唯一一個可以發佈網絡外的自動登錄cookie的應用程序。 – ixasilent 2011-12-19 16:29:28

回答

2

這只是一個想法,但有/曾經是(取決於您的Debian和PHP版本)PHP會話的錯誤。我建議你嘗試:

  1. 檢查this link - 這可能並不涉及您的問題,但它是值得一試
  2. 切換到數據庫驅動程序 - 我願意付出90%的機會,這將解決一切
  3. 測試不同的Debian,然後服務器上 - 這可能並不容易實現,雖然
+0

我不認爲該鏈接是適用的,但適當注意以備將來參考。該應用程序通過Kohana 3.0數據庫和Jelly模塊使用MySQL PDO。任何其他司機在腦海中?在這個服務器上有大約15個其他網站與其他沒有報告這個問題的客戶端相同( - 數據庫內容),所以我非常肯定它與網絡化妝和需要罰款調整這一個網站的Cookie生成。良好的聯繫!我會將其加入書籤,因爲它可能會解決會話超時問題,並且會在一個月後一直在我的背後的維基上發佈。 – ixasilent 2011-12-19 18:54:36

+0

我的意思是切換到會話數據庫驅動程序,不放棄PDO /果凍,如果這是你的想法;) – matino 2011-12-19 18:59:00

+0

你是正確的存儲會話在數據庫中修復此問題。說實話,我對這個解決方案並不滿意,但現在可以把它當作黑客來享用。當然,當成千上萬的用戶再次開始使用該應用程序時,我最終看起來像個傻瓜......我會回來的!爲了安全起見,我將重寫kohana_cookie類的set方法爲RFC 2109兼容。這至少是負責任的事情。 謝謝! – ixasilent 2011-12-19 19:40:40

2

哇這就是一個令人討厭的漏洞, 接得好!

到目前爲止,在PHP下生成cookie的最好方法是讓PHP做到這一點: session_start()。就這樣!如果你正在生成自己的cookie,那麼你真的搞砸了。現在你可以使用超級全球$_SESSION[]。最佳實踐是在您訪問應用程序中的$ _SESSION之前,在公共頭文件中調用session_start()

您可能還應考慮其他問題,如owasp a9,csrf和cookie標誌:HTTP_Only以及「安全」標誌(通過https強制cookie)。

+0

@搖滾謝謝!我已經通過代碼挖了幾次,並且可以驗證是的,我正在使用PHP來管理會話(session_start(),session_name(),session_set_cookie_params(),session_destroy()等)。但僅僅因爲你提到它,我會再次挖掘,仔細檢查,並在信譽達到時提供信用。它是一個SSL站點,並設置了安全和HTTP_ONLY標誌。 – ixasilent 2011-12-19 16:59:13

+0

對不起@Rook並不意味着在那裏打開你的名字。 – ixasilent 2011-12-19 17:10:58

+0

@ixasilent你永遠不需要設置一個cookie值。我認爲你依靠kohana_cookie類來識別用戶。這是使用setcookie(),這是邪惡的。 – rook 2011-12-19 17:50:29

0

我不知道如果我理解正確的你,但是......我明白,要求是這樣的:

用戶(工作站)==>代理()==>互聯網==>公司網站(和反向的響應)。

檢查代理是否設置「HTTP_X_FORWARDED_FOR」(在$ _SERVER超全局變量中)。這可能是確定用戶工作站IP地址的唯一方法。如果是這樣,你就完成了。

+0

關閉,但由於代理服務器也作爲ISP,因此不存在HTTP_X_FORWARDED_FOR。 – ixasilent 2011-12-29 16:38:29