kevinsmith / laravel-samesite-none-compat
为使用 Laravel 5.8+ 中的 SameSite=None cookies 时提供对旧客户端的支持
Requires
- php: >=7.2
- illuminate/http: ^5.8|^6
Requires (Dev)
- doctrine/coding-standard: ^6.0
- friendsofphp/php-cs-fixer: ^2.16
- phpunit/phpunit: ^8.5
- roave/security-advisories: dev-master
This package is auto-updated.
Last update: 2024-08-25 10:33:00 UTC
README
为 Laravel 5.8+ 中标记为 SameSite=None; Secure
的 cookies 提供对旧客户端的支持
本包实现了在 这篇精彩的 web.dev 文章 中提出的第一个建议,该文章由 Rowan Merewood 编写。如果你不确定为什么这一切很重要,或者当前浏览器处理 cookies 的 SameSite
属性发生了什么变化,请鼓励你阅读 Rowan 的详尽 SameSite 解释。
它如何工作
在过去,没有明确 SameSite
值的 cookie 可以在没有浏览器限制的情况下在第三方上下文中写入和读取(例如,你应用在另一个域页面的 iframe 中)。出于安全原因,最流行的浏览器(Chrome、Firefox、Safari、Edge)现在正在限制它们的默认 cookie 行为,以便只有标记为 SameSite=None; Secure
的 cookie 才能在第三方上下文中读取。
好的,我们只需要更新设置这些 cookie 的方式,对吧?等等。遗憾的是,以这种方式标记 cookie 可能会使它们与旧浏览器 不兼容。而且,根据你的受众,很多人 仍在使用旧浏览器。
此包采用一种解决方案,允许你升级你的应用 cookie 以符合当前建议,同时通过为所有标记为 SameSite=None; Secure
的出站 cookie 包含回退来保持与旧浏览器的兼容性。所以如果你的应用设置了这样的 cookie
appcookie=value; SameSite=None; Secure
此包将在响应中添加此回退 cookie,并将其发送回浏览器
appcookie__ssn-fallback=value; Secure
当你的应用收到入站请求时,此包将检查 cookie,并提升任何尚未标记为 SameSite=None; Secure
的主要对应回退 cookie。
安装
将中间件添加到 Laravel 的 全局中间件属性 的顶部,以便这是每个进入应用请求的第一个中间件
protected $middleware = [ \KevinSmith\SameSiteNoneCompat\Laravel\SameSiteNoneMiddleware::class, // all other middleware... ];
然后更新 config/session.php
以启用安全 cookie 并将 same_site
配置设置为 'none'
。请注意,这两个属性都设置正确很重要。没有指定 Secure
的标记为 SameSite=None
的 cookie 将不会工作。
要检查它是否按预期工作,请使用 Chrome 检查你的 cookie 并查找所有添加了后缀 __ssn-fallback
的 cookie 复制品。当然,你希望在所有受众使用的浏览器中测试这一点,以访问你的应用程序。
许可证
版权所有 2020 Kevin Smith
根据 Apache 许可证 2.0 版(“许可证”);除非遵守许可证,否则您不得使用此文件。您可以在以下位置获得许可证副本:
https://apache.ac.cn/licenses/LICENSE-2.0
除非适用法律要求或书面同意,否则在许可证下分发的软件是以“现状”为基础分发的,不提供任何形式(无论是明确还是暗示)的保证或条件。有关许可证的权限和限制的具体语言,请参阅许可证。