浏览器如何知道在请求时将哪些cookie发送到服务器?

Cen*_*ion 5 javascript php security cookies csrf

我知道Cookie的工作原理,刚刚开始研究为什么Codeigniter不会将生成的csrf令牌存储在SESSION中,而只是存储在cookie中。关于安全性,我开始考虑php setcookie()函数参数,例如路径和域。我问自己,是否可以通过另一个域(例如“ www.evilsite.com”)中的path =“ /”和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');
Run Code Online (Sandbox Code Playgroud)

我使用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”。

Gum*_*mbo 2

\n

[\xe2\x80\xa6] 是否可以从另一个域、某些“www.evilsite”设置“evil_cookie”,路径=\'/\' 和域=“www.goodsite.com\” .com\'?

\n
\n

不,用户代理应该忽略具有与当前请求的域不匹配的域属性的Set-Cookie指令:

\n
\n

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

\n
\n

用户代理甚至不会接受此类 cookie。类似的情况也适用于路径安全属性。

\n

另请参阅浏览器 cookie 域如何工作?有关用户代理如何解释属性值的示例。

\n