我知道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