Menu::getItems() 的静态缓存既不针对用户,也不针对区域 — 管理员侧栏默认丢失项目;持久运行时下会出现跨用户泄漏
虫子报告
QQ 问题描述
Webkul\Core\Menu:Get Projects() ' 将其结果记为当地固定的美元项目'。 缓存按** nothing ** 而不是`$rea ' 的参数,而不是经认证的用户,所以PHP程序中的第一个呼叫者会在此过程中为后来的每个呼叫者修正菜单。
有两个后果:
- ** 管理员的侧边栏无声地丢失物品。 ** 如果同一过程中早先的呼叫解决了低保用户的菜单,管理员会得到该用户的菜单. 这或许可以解释断断续续的"菜单项缺失"报告不按要求转载——完全取决于一个过程中的呼叫命令.
- QQGet 项目('客户') 后返回管理员菜单。 ** " 美地 " 论点在缓存热出后就被忽略了,即使没有 " 美地 " 时会采用这种方法。
由于它的关键是两个方面,这似乎是一种监督,而不是一种蓄意的取舍——这就是为什么下面所建议的固定只是"正确的关键"而不是重新设计.
在PHP-FPM下,影响是有限的:每个过程一个请求,所以缓存只活在一个请求解决一个以上用户菜单时,命令问题才会浮出水面. 在一个持久运行时间——Laravel Octane,Swoole,RoadRunner,或者一个长寿的排队工人制作邮件下,缓存在每一个工人的请求中生存,同一个代码成为了交叉用户菜单漏出,直到工人回收.
** 这不是一个安全弱点,我不是作为一个报告。 ** 路由授权由Admin\Http\Middleware\Bouncer'通过acl ()->getRoles ()'单独执行,它没有受到影响——一个看到菜单条目被泄露的用户在路由上仍然收到401个. 仅此为演示文稿层: 侧边栏显示查看器无法使用的条目, 或者隐藏可以使用的条目 。
先决条件
- Laravel 12 / PHP 8.3 / MySQL 8.0 — Krayin v2.2.0 (Webkul\Core\Core:KRAYIN VERSION) (中文(简体) ).
- 提交编号: de2c37a6
- 复制步骤
不需要奥克塔尼 解决两个用户的菜单的任何单一的PHP过程都显示这一点,所以简单的`Artisan'就足够了——这个机制与八烷工人在各种请求中展示的相同。
有两个用户:一个是 " permission type = all " 角色的管理员,另一个是自定义角色的工作人员用户,该角色不持有`leads ' 许可。
- 作为工作人员用户解决菜单
- 在同一过程中解决作为管理员的菜单
- 比较——然后与倒置的顺序相重复
翻译: $admin = 用户: find(1); $staff = 用户: 在哪里( “电子邮件” , “ staff@ example. test”)- > first( );
auth()- > guard('user')- > setUser($staff); $staffKeys = 收集(菜单()- > 获得项目('admin')- >map(fn (i) $i- > getKey ());
auth()->guard('user')-> setUser($admin) ; 2. $adminKeys = 收集(菜单(-) > 获得项目('admin')->地图(fn (一) $- $i- > getKey ());
`包/Webkul/Core/src/Menu.php':
翻译:
公共函数获取项目(?字符串 $rea = 无效,字符串)
. . . . . . .内容来源: krayin/laravel-crm