我知道cookie是如何工作的,只是開始挖掘爲什麼Codeigniter不會在SESSION中存儲生成的csrf標記,它只是存儲在cookie中。關心安全性,我開始考慮php setcookie()函數參數,如路徑和域。我問過自己是否有可能從另一個域名,某個'www.evilsite.com'設置'evil_cookie'的路徑='/'和domain ='www.goodsite.com'?另一個問題是,在向www.goodsite.com發出請求時,'evil_cookie'會被髮送到'www.goodsite.com'嗎?瀏覽器在請求時如何知道發送給服務器的cookie?
所以,我做了一個測試。我心中已經創建了「set_cookie.php」文件,並將其上傳到一些「www.evilsite.com」:
setcookie('evil_cookie', 'gotcha', time() + 60 * 30, '/', 'www.goodsite.com');
我使用Firefox和螢火蟲+的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'。
文檔中的'$ domain'表示像'/ forum /'這樣的相對路徑,而不是整個url。 – OptimusCrime 2012-01-10 15:47:05
我不同意。對於那些東西是'路徑'參數。域名是完整的域名或子域名。檢查出php.net – Centurion 2012-01-10 17:09:41