2011-11-03 88 views
2

當有多個對當前域有效的相同名稱和路徑的Cookie時,我對各種瀏覽器的行爲感興趣。例如。在瀏覽器中存儲這兩個餅乾:具有相同名稱/路徑的多個Cookie的瀏覽器行爲

key=value; path=/; domain=foo.bar.baz 
key=value; path=/; domain=bar.baz 

會是怎樣的Cookie頭當用戶訪問foo.bar.baz的內容?

RFC 2965有此說關於這個問題:

如果多個cookie滿足以上,他們在 是有序的Cookie頭,使得那些有更具體的路徑屬性 先於那些不太具體的標準。關於其他 屬性(例如,域)的排序未指定。

(這是一個非常奇怪的設計選擇,但這就是我們所擁有的)。我想服務器端框架使用第一個值,因爲至少有時更具體(我檢查了PHP,它確實如此)。

我想知道的是主要瀏覽器的行爲:他們首先發送哪個cookie? (換句話說,有多少我可以靠我的申請得到了「正確」的,更具體的價值?)

+0

我認爲,不管目前的任何瀏覽器的行爲,你都不能依賴這樣的自sta以來的一個經驗回答ndard說「未指定」,任何瀏覽器/任何版本都可以隨時改變這種行爲... – Yahia

+0

這不是真正的依賴,更多的是爲了防禦它......這可能會導致同一父域中的兩個站點改變彼此的行爲不可預知的方式。 (這就是我發現它的實際情況,兩個網站都使用了PHPSESSID cookie,並且人們被莫名其妙地註銷了。) – Tgr

+0

不確定我明白...你想基於一個經驗豐富的答案來防禦「未定義的行爲」(基於標準),只要一個新的瀏覽器補丁或版本出現,它就會過時/不完整。你將如何防守,你將如何保持你的防守up2date? – Yahia

回答

4

按上述意見:

對這個顯然是「不確定的行爲,最簡單的防守(標準 - 明智)「從我的POV是不使用PHPSESSID在主域bar.baz,而是在www.bar.baz - 而不是在www.bar.baz - 子域將工作正常,因爲根據標準沒有」後備「在這種情況下,所以cookie停留在自己的子域。需要

一個可能的問題進行檢查:
子域上運行

PHP腳本可以明確地被配置爲設置的Cookie在主域......如果是這樣的情況下(代碼類似於ini_set('session.cookie_domain', 'bar.baz');)那麼您需要將此配置更改爲「標準」(通過刪除顯示的代碼),這意味着子域上的腳本應該只在其自己的子域上設置Cookie。

編輯 - 按評論:

如果您還沒有對其他一些子域名的任何控制,則「終極防禦」是您PHPSESSID餅乾重命名爲真正獨特的(像一個GUID以PHPSESSID作爲前綴)或者由calling session_name() BEFORE session_start()或者由setting it in the config - 這種方式你規避了整個問題,無論子域/瀏覽器版本等。

+0

問題是,即使我確定cookie始終設置在「www.bar.baz」(我無論如何,在bar.baz上設置Cookie都會有一些缺點,從增加的圖像/腳本請求大小到會話劫持漏洞),'someothersite.bar.baz'上的腳本(可能維護得不好,或者不受我控制)仍然可能會干擾我的登錄過程。我想知道這樣的問題可能會有多廣泛。 – Tgr

+0

@Tgr我解決了這個問題......請參閱我的EDIT,以獲得獨立於瀏覽器/版本的解決方案,並且可以以一種甚至行爲不當的子域不會爲您的子域創建問題的方式實現... HTH – Yahia

+0

更改會話cookie的名稱當然是一個好主意,但是有很多cookie可能會發生衝突,有些Cookie使用固定名稱(例如Google Analytics跟蹤cookie)。我想知道的是瀏覽器的百分比是否會成爲問題。 – Tgr

相關問題