php - Yii 1.1:读取用于识别用户的 $_COOKIE 时的竞争条件
问题描述
当 2 个用户(几乎)同时访问同一页面时,我遇到了竞争情况。这会导致用户获得对其他用户数据的访问权限。
几个月来,我一直试图抓住这个问题,并最终设法做到了。我使用的是 Yii Framework 1.1,用户登录流程如下:
- 会话存储在数据库中,我实际上并没有使用 $_SESSION 来存储任何东西。
- 生成的会话 ID 存储在 cookie 中并填充 $_COOKIE,PHP 使用该 ID 将用户连接到他们的数据。
- 在登录页面中,我将 cookie 中的会话 ID 存储在表单的一个字段中。
- 用户登录,输入被验证,会话数据被创建并与用户记录一起存储,包括表单中的会话 ID(真实会话 ID)。然后,用户通过另外 2 个控制器(LoginCheck、Dashboard)进入 Dashboard。
- 在会话期间,用户将经常返回仪表板。
- 当 2 个或更多用户(几乎)同时访问仪表板页面(通过登录或从站点内的页面返回)时,两个用户最终将获得相同的 cookie id 和会话数据。我可以通过使用存储在 $_COOKIE 变量中的 cookie 值检查基于浏览器的 cookie 来确认这一点。使用不正确的数据在页面上简单刷新仪表板会导致加载正确的数据。
我研究了 PHP 会话的竞争条件,其中一些提供使用 $_COOKIE 来解决会话的竞争条件,因此并没有真正为我提供任何解决问题的方法。
由于我能够捕获问题,因此我可以通过刷新轻松解决它,但如果有更稳定的解决方案可用,我更愿意沿着这条路线走。
任何建议将不胜感激。
干杯
解决方案
您可以将带有 x 或 x+ 标志的 fopen 用于共享文件。只有其中一个实例可以同时打开文件。
但是,您所描述的内容不一致且奇怪:您在使用所描述的会话时不需要处理竞争条件。我想问题在于您在每次页面加载时都重新生成了会话 ID,因此您可能正在做一些您不应该做的事情。
在会话上,每个用户代理必须只生成一次会话 ID,但是正如您所描述的,该 ID 在每次页面更改时都会重新生成,并且作为次要问题,它是以低熵生成的。
如果你解决了第一个问题,那么低熵问题将得到缓解,但没有解决。
推荐阅读
- python-3.x - 发送从 webhook 收到的消息的 Discord bot
- flutter - FlutterLab:错误:此库已禁用空安全功能
- javascript - Cookies.get() 未定义
- mongodb - mongo $minKey 是什么意思?
- css - 我正在使用@media 查询,但我在不同屏幕上编写的代码不起作用
- javascript - 网站如何能够检测到使用 Chromium(如 Electron)的浏览器不是 Chrome 本身?
- python - 海龟图形到可执行文件
- neovim - 如何从子目录中提取 compile_commands.json?
- python-3.x - 如何让 flake8 捕捉不可调用的?
- macos - 卸载 Lua