我正在编写一个 PHP 类来处理/解析Cookie
和Set-Cookie
HTTP 标头,以便在我的自定义用户代理(爬虫、刮板、机器人等)中使用它,并且在测试它时我发现它的行为与 Firefox 不同他们处理标题中的Path
属性的方式。Set-Cookie
我回到RFC 6265,我是对的
###如何重现?在任何 PHP 文件中设置此行并请求它
<?php
header("set-cookie: foo=1; path=/bar/", true);
exit;
现在使用 Firefox 请求/bar
,您将看到 Firefox 正在发送 cookie,而/bar/
根据规范它应该只发送到或更长的路径!
###规格是什么?
我将引用RFC 6265 5.1.4 Paths and Path-Match中的相关部分
如果至少满足以下条件之一,则请求路径路径匹配给定的 cookie 路径:
o cookie-path 和 request-path 是相同的。
o cookie-path 是 request-path 的前缀,cookie-path 的最后一个字符是 %x2F ("/")。
o cookie-path 是 request-path 的前缀,并且不包含在 cookie-path 中的 request-path 的第一个字符是 %x2F ("/") 字符。
在这种情况下,请求路径/bar
和 cookie 路径/bar/
不匹配
###谷歌浏览器怎么样?
谷歌浏览器不会将 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和draft-ietf-httpbis-rfc6265bis-02的规范,并且在“路径和路径匹配”部分中这两个规范几乎相同。(我在问题中引用的部分)
我向 Bugzilla 报告了一个错误https://bugzilla.mozilla.org/show_bug.cgi?id=1579552