6

我正在编写一个 PHP 类来处理/解析CookieSet-CookieHTTP 标头,以便在我的自定义用户代理(爬虫、刮板、机器人等)中使用它,并且在测试它时我发现它的行为与 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

MDN Set-Cookie 文档使用了RFC 6265draft-ietf-httpbis-rfc6265bis-02的规范,并且在“路径和路径匹配”部分中这两个规范几乎相同。(我在问题中引用的部分

我向 Bugzilla 报告了一个错误https://bugzilla.mozilla.org/show_bug.cgi?id=1579552

4

1 回答 1

2

是的,Chrome 是对的,正如ehsan akhgari在错误报告中所评论的那样

是的,我们的路径匹配算法与规范完全不同。与Chrome相比,它们似乎非常严格地遵循规范。

...他们更改了 Firefox 的源代码并修复了它https://phabricator.services.mozilla.com/D45427

于 2019-09-10T18:50:52.067 回答