【发布时间】:2012-02-07 00:33:14
【问题描述】:
我知道 cookie 是如何工作的,刚刚开始研究为什么 Codeigniter 不会将生成的 csrf 令牌存储在 SESSION 中,它只是存储在 cookie 中。考虑到安全性,我开始考虑 php setcookie() 函数参数,例如路径和域。我问自己是否可以从另一个域,从一些“www.evilsite.com”设置“evil_cookie”,路径=“/”和域=“www.goodsite.com”?还有一个问题是,在对 '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”。
【问题讨论】:
-
$domain在文档中的意思是像/forum/这样的相对路径,而不是整个网址。 -
我不同意。对于那些东西是'路径'参数。域是一个完整的域或子域。查看 php.net
标签: php javascript security cookies csrf