猿问

Firefox 不符合 RFC6265 关于处理 cookie 的路径属性

我正在编写一个 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

MDN的Set-Cookie文件使用这两种规格RFC 6265草案,IETF-httpbis-rfc6265bis-02和两种规格几乎是“路径和路径-匹配”部分中的相同。(我在问题中引用的部分

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


米琪卡哇伊
浏览 318回答 1
1回答

呼如林

是的,Chrome 是对的,正如ehsan akhgari在错误报告中所评论的那样是的,我们的路径匹配算法与规范完全不同。与Chrome相比,它们似乎非常严格地遵循规范。...他们更改了 Firefox 的源代码并修复了它https://phabricator.services.mozilla.com/D45427
随时随地看视频慕课网APP
我要回答