簡體   English   中英

瀏覽器如何知道在請求時將哪些cookie發送到服務器?

[英]How browsers know what cookies to send to server when requesting?

我知道Cookie的工作原理,剛剛開始研究為什么Codeigniter不在SESSION中存儲生成的csrf令牌,而是將其存儲在cookie中。 關於安全性,我開始考慮php setcookie()函數參數,例如路徑和域。 我問自己,是否可以從另一個“ www.evilsite.com”域中的路徑=“ /”和domain =“ www.goodsite.com”中設置“ evil_cookie”? 另一個問題是,在執行對“ www.goodsite.com”的請求時,是否會將“ evil_cookie”發送到“ www.goodsite.com”?

所以,我做了一個測試。 我創建了“ set_cookie.php”文件並將其上傳到一些“ www.evilsite.com”:

setcookie('evil_cookie', 'gotcha', time() + 60 * 30, '/', 'www.goodsite.com');

我使用Firefox和Firebug + Cookie插件查看發送和接收的Cookie。 因此,在請求“ www.evilsite.com/set_cookie.php”后,我確實收到了“ evil_cookie”。 但是,該cookie沒有保存(至少在firebug cookie插件面板中查看時沒有這樣的cookie)。 再次請求“ www.evilsite.com/set_cookie.php”時,也不會發送該消息。 剛收到但未保存。

從Firefox瀏覽器的角度來看,僅將Cookie保存為當前域是合乎邏輯且安全的。 恕我直言,那些設置cookie()參數(例如路徑和域)的對象主要是用於管理當前域及其子域的cookie,但不適用於外部域。 我有點不高興,無法在php.net上找到相關信息,所以我不確定這是與瀏覽器相關的行為以及它如何處理“第三方Cookie”的細節,還是更標准? 所有瀏覽器的行為都一樣嗎? 如果有任何可靠可靠的聲明來源,請分享。

這也與cookie的另一種用法有關-存儲會話數據(不使用PHP本機會話,例如Codeigniter這樣做)。 因此,如果所有瀏覽器都不允許使用當前域以外的其他安全cookie,那就可以了。 但是,它不能保護CSRF,因為“ www.evilsite.com”可能包含邪惡的javascript代碼,當用戶執行並從“ www.evilsite.com”獲得請求時,該代碼將直接在客戶端上創建“ evil_cookie”。

Cookie遵循相同的原始政策 :網站只能為其自己的域寫入和讀取Cookie。

如您所知,只能為當前域或其子域設置cookie(否則,任何人都可以替換任何人的cookie;隨之而來的是混亂)。 這是由瀏覽器強制執行的:如果嘗試從服務器端(使用HTTP標頭)為另一個域設置cookie,則瀏覽器將忽略cookie。 如果嘗試從客戶端(使用Javascript)執行相同操作 ,則相同的原始策略將阻止您執行此操作。

因此,www.evilsite.com可以使用Javascript為自己的域設置cookie,但這不是問題:它已經可以使用HTTP標頭來做到這一點。 這里沒有新的攻擊媒介。

[…]是否可以從另一個“ www.evilsite.com”域中的路徑=“ /”和domain =“ www.goodsite.com”域中設置“ evil_cookie”?

否,用戶代理應忽略具有與當前請求的域不匹配Domain屬性的Set-Cookie指令:

用戶代理將拒絕cookie,除非Domain屬性為cookie的范圍指定一個范圍,該范圍將包括原始服務器。 例如,用戶代理將接受來自foo.example.com的Domain屬性為“ example.com”或“ foo.example.com”的cookie,但是用戶代理將不接受Domain屬性為的cookie。 “ bar.example.com”或“ baz.foo.example.com”。

用戶代理甚至不會接受此類cookie。 類似的適用於路徑安全屬性。

另請參閱瀏覽器cookie域如何工作? 有關用戶代理如何解釋屬性值的示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM