2012-01-10 57 views
4

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

+0

文档中的'$ domain'表示像'/ forum /'这样的相对路径,而不是整个url。 – OptimusCrime 2012-01-10 15:47:05

+0

我不同意。对于那些东西是'路径'参数。域名是完整的域名或子域名。检查出php.net – Centurion 2012-01-10 17:09:41

回答

1

[...]是有可能从另一个域设定 'evil_cookie' 与路径= '/' 和域= 'www.goodsite.com',从一些 'www.evilsite.com'?

号,用户代理应该忽略的Set-Cookie指令与属性不domain-match当前请求的域:

的用户代理将拒绝Cookie,除非域属性 指定该cookie的范围将包括来源 服务器。例如,用户代理将接受来自“example.com”的 域属性或来自 foo.example.com的“foo.example.com”的cookie,但用户代理将不接受具有 的cookie “bar.example.com”或“baz.foo.example.com”的域属性。

这样的cookie甚至不会被用户代理接受。 路径安全属性类似适用。

有关属性值如何由用户代理解释的示例,另请参见How do browser cookie domains work?

3

Cookie受限于same origin policy:一个网站只能为自己的域名写入和读取cookie。

+0

因此,setcookie()中的域参数仅用于管理当前域及其子域的cookie可用性吗? – Centurion 2012-01-10 15:51:08

+0

-1你错了。您可以在'www.example.com'中的'example.com'中设置一个cookie。 – Gumbo 2012-01-10 16:02:47

2

只有当您发现了alredy时才能为当前域或其子域设置Cookie(否则,任何人都可以替换其他人的cookie;随之出现混乱)。这由浏览器强制执行:如果您尝试从服务器端为其他域设置cookie(使用HTTP标头),浏览器将忽略该cookie。如果您尝试从客户端执行相同的操作(使用Javascript),same origin policy将阻止您这样做。

因此,www.evilsite.com可以使用Javascript为其自己的域设置Cookie,但这不是问题:它可以使用HTTP标头来完成。这里没有新的攻击媒介。

相关问题