![](/img/trans.png)
[英]How exactly sessions and cookies combination , identify the correct user when a request send to the server
[英]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。
[…]是否可以從另一個“ 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.