【问题标题】:PHP 5.6 - $_COOKIE become empty when more than 2 x 4KB cookie inserted from browserPHP 5.6 - 当从浏览器插入超过 2 x 4KB cookie 时,$_COOKIE 变为空
【发布时间】:2021-04-14 16:44:01
【问题描述】:

我有一个 PHP (5.6) 应用程序。我对浏览器进行基准测试并尝试记录 $_COOKIE 变量。 (或刷新 info.php 以从 PHP 变量中获取 cookie)

由于一个 cookie 元素的 4KB 是浏览器/PHP 的限制,所以我使用 2048* 字母 A 作为测试 cookie 的值。

  1. 当我插入 test1 = aaaaaaa....aaaaaa('a' 的 2048 次)
  • 可以正确记录 $_COOKIE。
  1. 当我插入更多测试 cookie 时,'test2','test3', ... 与 test1 的值相同
  • 可以正确记录 $_COOKIE。

  1. 当我插入第 6 个时,'test6'
  • $_COOKIE 变为空[] 并且 info.php 开始不显示 _COOKIE 变量。

所以 cookie 的总大小限制为 12KB-13KB,我该如何取消或增加这个限制?我尝试了不同的配置,它有不同的限制。 我也设置了一个Docker PHP,好像没有限制。通过比较 info.php,我看不出有什么区别。

因为我知道现代浏览器可以有 500-600 个不同的 cookie,每个 4KB 作为限制。但是 PHP 的 3 个全尺寸 cookie 实在是太小了。

我不确定是哪个插件或设置阻止设置 cookie。

【问题讨论】:

    标签: php amazon-web-services session cookies php-5.6


    【解决方案1】:

    和php没关系,你把cookie的值全部用了4k就不好了

    取自cookie rfc6265

    实际的用户代理实现对数量和
    有限制 他们可以存储的 cookie 的大小。通用用户代理应该
    提供以下各项最低功能:

    o 每个 cookie 至少 4096 字节(以 cookie 的名称、值和属性的长度)

    o 每个域至少 50 个 cookie。

    o 总共至少 3000 个 Cookie。

    服务器应该使用尽可能少和尽可能小的 cookie 以避免 达到这些实施限制并最小化网络
    由于每个请求中都包含 Cookie 标头,因此带宽。

    如果用户代理未能返回,服务器应该优雅地降级 Cookie 标头中的一个或多个 cookie,因为用户代理可能 根据用户的命令随时驱逐任何 cookie。

    说到这一点,你应该考虑查看每个浏览器的规格,因为我相信它们有自己的局限性

    【讨论】:

    • 我不是在这里寻求最佳实践。真实场景中总是存在限制我们进行最佳实践的限制。描述还说它是相同的浏览器,相同的 php 构建但不同的基准。您的参考资料还说 4KB 是 [最低] 要求,也就是说在现代环境中使用更大的 cookie 应该没什么不好。
    • 你说你需要一个关于正在发生的事情的建议,所以我建议你参考 rfc,cookie 的大小应该是 4k,包括键值、到期日期、路径、加上其他属性。而且你使用 4k 只是为了价值,你肯定会遇到像你这样的奇怪问题。我不明白你为什么不赞成这个帖子。
    • 抱歉,我会更改描述,因为我用 2KB 重新测试我的案例,PHP 似乎在总标题大小达到 12-13KB(5~6 * 2KB cookie)时中断,这是相同的当它以全尺寸获得时。
    • 问题保持不变,它不应该与 RFC 提到的限制有关。由于我在另一个 Docker PHP 中也提到过,因此我可以使用相同的浏览器和相同的 PHP 版本插入任意数量的 cookie。
    【解决方案2】:

    这可能与网络服务器限制有关 - AFAIK 每个网络服务器都有一个header size limit(cookie 在标头中发送),cookie 中如此大量的数据肯定会达到这个限制。您没有指定您使用的网络服务器,但至少对于 Apache,您可以使用 LimitRequestFieldSize 指令进行调整。

    但这可能是更高级别的任何事情。如此大的标头通常表示一些恶意活动(或至少是故障),并且默认情况下可能会在 WAF 或负载均衡器级别被阻止。

    【讨论】:

    • 我搭建了一个ELB,后面放了CloudFormation,nginx托管的网站,我把nginx限制提升到了终极;所以根据你的发现和我的假设是 Header 没有从客户端传递给 PHP 引擎,这导致 _COOKIE 为空;谢谢,这可能是正确的。我会验证你的发现。从现在开始,我没有看到服务器或网页上记录任何错误;我需要找到另一种方法来找到靴子
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 1970-01-01
    • 2015-08-12
    • 2010-11-18
    • 2017-09-10
    • 2019-01-30
    相关资源
    最近更新 更多