我正在编写一个 PHP 类来处理/解析Cookie和Set-CookieHTTP 标头以在我的自定义用户代理(爬虫、抓取工具、机器人等)中使用它,在测试它时我发现它的行为与 Firefox 在他们处理标头中的Path属性的方式Set-Cookie。我回到了RFC 6265,我是对的
###如何重现?在任何 PHP 文件中设置这一行并请求它
<?php
header("set-cookie: foo=1; path=/bar/", true);
exit;
现在/bar用 Firefox请求,你会看到 Firefox 正在发送 cookie,而它应该只/bar/根据规范发送到或更长的路径!
###规格是什么?
我将引用RFC 6265 5.1.4 Paths and Path-Match 中的相关部分
如果至少满足以下条件之一,则请求路径路径匹配给定的 cookie 路径:
o cookie-path 和 request-path 是相同的。
o cookie-path 是请求路径的前缀,cookie-path 的最后一个字符是 %x2F ("/")。
o cookie-path 是请求路径的前缀,请求路径的第一个不包含在 cookie-path 中的字符是 %x2F(“/”)字符。
在这种情况下,请求路径/bar和 cookie 路径/bar/不匹配
###Google Chrome 怎么样?
谷歌浏览器不会将 cookie 发送给/bar👍
我的问题
谁是对的?铬合金 ?还是火狐?
###额外细节:
我在 Linux 上的 Firefox 66.0.4 和 Chrome 版本 76.0.3809.132 Linux 上进行了测试
这是我在课堂上使用的相关函数
public static function isPathMatch(string $requestPath, string $cookiePath)
{
if ($requestPath === $cookiePath) return true;
if (strpos($requestPath, $cookiePath) !== 0) return false;
if (substr($cookiePath, strlen($cookiePath) - 1, 1) === "/") return true;
if (substr($requestPath, strlen($cookiePath), 1) === "/") return true;
return false;
}
这是我为 Firefox找到的第二个问题,但它仍然是我最喜欢的浏览器 :)
感谢@fendall 关于 RFC 的评论,我跟踪了与此问题相关的 RFC
1997 年 2 月RFC 2109历史。被淘汰
2000 年 10 月RFC 2965历史。被淘汰
2011 年 4 月RFC 6265建议标准,如果获得批准将被废弃
2017 年 8 月草案-ietf-httpbis-rfc6265bis-02互联网草案
该MDN的Set-Cookie文件使用这两种规格RFC 6265和草案,IETF-httpbis-rfc6265bis-02和两种规格几乎是“路径和路径-匹配”部分中的相同。(我在问题中引用的部分)
我向 Bugzilla 报告了一个错误https://bugzilla.mozilla.org/show_bug.cgi?id=1579552
呼如林