【问题标题】:Laravel session cache on server (configuration bug)服务器上的 Laravel 会话缓存(配置错误)
【发布时间】:2020-02-09 00:45:15
【问题描述】:

我在 Laravel 的 Sessions 中遇到了这个奇怪的问题,但在任何地方都找不到解决方案。我终于想通了,我想我会分享,希望它可以帮助将来的人。


TLDR;

问题:Engintron 配置微缓存混淆了会话 ID

解决方案:将会话 cookie 名称从 laravel_session 更改为 userID


全文:

问题:只有在登录过程中我才真正注意到问题,因为这是会话最重要的地方。我注意到如果两个用户同时或几乎同时登录,那么他们会切换身份,或者后者会以之前用户的身份登录。我还注意到后者在以该用户身份登录时会获取前者的会话 cookie。

配置:Laravel 6.2、PHP 7.2 和 Engintron 将 NGINX 集成到 cPanel/WHM

原因:这里发生的情况是会话正在被缓存,而后一个用户正在使用缓存的版本登录。

【问题讨论】:

  • 这是一个严重的错误,会话根本不应该被缓存。
  • 是的,你完全正确@Viney。我有一段时间遇到了麻烦,不幸的是,在网上找到的文档很少。希望这可以帮助其他人并节省他们大量的时间。 :)

标签: laravel session devops


【解决方案1】:

详细原因

这里是 Engintron 的代理参数动态的默认 configuration 的一部分。

# CMS (& CMS extension) specific cookies (e.g. Joomla, K2 for Joomla, WordPress, WooCommerce, PrestaShop etc.)
if ($http_cookie ~* "(joomla_[a-zA-Z0-9_]+|userID|wordpress_(?!test_)[a-zA-Z0-9_]+|wp-postpass|comment_author_[a-zA-Z0-9_]+|woocommerce_cart_hash|woocommerce_items_in_cart|wp_woocommerce_session_[a-zA-Z0-9]+|sid_customer_|sid_admin_|PrestaShop-[a-zA-Z0-9]+)") {
    set $CACHE_BYPASS_FOR_DYNAMIC 1;
    set $EXPIRES_FOR_DYNAMIC 0;
}

这里发生的事情是,Engintron 将微缓存任何不喜欢的 cookie:

joomla_[a-zA-Z0-9_]+|userID|wordpress_(?!test_)[a-zA-Z0-9_]+|wp-postpass|comment_author_[a-zA-Z0-9_]+|woocommerce_cart_hash|woocommerce_items_in_cart|wp_woocommerce_session_[a-zA-Z0-9]+|sid_customer_|sid_admin_|PrestaShop-[a-zA-Z0-9]+

请注意,laravel_session 不在其中。因此,Engintron 将对任何 laravel session Cookie 进行微缓存,并且在这些配置下,您可能会允许用户错误地登录到另一个帐户。

解决方案:

有两种方法可以解决这个问题。您可以调整服务器上或应用内的配置。

A) 在 Laravel 中:

更改 config/session.php 第 127 行:

'cookie' => env(
        'SESSION_COOKIE',
        Str::slug(env('APP_NAME', 'laravel'), '_').'_session'
    ),

'cookie' => 'userID',

B) 在服务器上:

或者只需在特定 cookie 列表中添加 laravel_session 或您为应用的 cookie 命名的任何名称,如下所示:

if ($http_cookie ~* "(laravel_session|joomla_[a-zA-Z0-9_]+|userID|wordpress_(?!test_)[a-zA-Z0-9_]+|wp-postpass|comment_author_[a-zA-Z0-9_]+|woocommerce_cart_hash|woocommerce_items_in_cart|wp_woocommerce_session_[a-zA-Z0-9]+|sid_customer_|sid_admin_|PrestaShop-[a-zA-Z0-9]+)") {
    set $CACHE_BYPASS_FOR_DYNAMIC 1;
    set $EXPIRES_FOR_DYNAMIC 0;
}

我希望这对某人有帮助:)

编码愉快!

【讨论】:

  • 我也将此问题通知了 Engintron:github.com/engintron/engintron/issues/1150
  • 谢谢,解决方案 A 有效!但是......你能解释一下为什么你将键'cookie'设置为'userID'我正在寻找有关它的信息但我没有得到任何东西。再次感谢,
  • Laravel 对访客和登录用户使用了相同的 cookie,我该如何解决这个问题?
  • @Zione01,看看我上面设置的两个解决方案。
  • @Benyi,这实际上是针对不同框架/CMS 的包罗万象的策略。即,你也有 Joomla、wordpress 等。因此,这应该适用于大多数使用 Engintron 遇到此问题的人
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多