#10617·parse-server

保存 _Role 会清除整个缓存,在 Redis 缓存适配器上发出 FLUSHDB 指令

作者: AdrianCurtin创建于 2026年8月1日更新于 2026年9月10日

新问题核对表

  • FLUSHDB ' 、SubCache ' 和缓存清理搜索现有问题,包括已关闭问题。 唯一相关的项目是#3523.
  • 公开而不是保密:主要影响是缓存可用性问题,次级影响要求操作员共享Redis数据库,代码路径在源代码中明显可见. 如果维护者喜欢, 乐于将此移动为私人报告 。

QQ 问题描述

保存任何 QQ- Role 对象可以清除 ** entire ** 缓存, 而不仅仅是角色子缓存 。 用 “RediscacheAdapter” 此选项是原始的“ FLUSHDB ” , 它删除了 Redis 数据库中的每个密钥 。

原因是“ subCache# clear () ” 放弃该类中所有其他方法所应用的密钥前缀 :

  1. [`RestWrite.js#L1566'](https://GitHub.com/parse-community/parse-server/blob/315e15737d902d85f46563b2863a9e19bf1ff4/src/RestWrite.js#L1564-L1568)称"在每一所所所所创建或更新的‘.config.cache Captail.role.cle.cle.cle ()'.
  2. [CacheController.js#L37-L39'](https://GitHub.com/parse-community/parse-server/blob/315e15737d902d85f46563b2863a9e19bf1ff4/src/Caproller.js#L37-L39]:SubCache#clear()'忽略了`这个.prefix',代表直接致送上级控制员.
  3. [Cache Captain.js#L66-L68'](https://GitHub.com/parse-community/parse-server/blob/315e1537d902d85f46563b2863a9e19bf1ff4/src/Capain.js#L66-L68]:Cache Captain#clear ()'同样忽略了`This.appId'和给适任者的代表。
  4. [RediscacheAdapter.js#L83-L87'](https://GitHub.com/parse-community/parse-server/blob/315e17637d902d85f465563b2863a9e19bf1ff4/src/Adapters/Cache/RediscacheAdapter.js#L83-L87):清楚()'问题`FLUSHDB'。

不对称是造成人们容易错过的原因:Get'、put'和del' on " SubCache " 都正确地建造了joinKeys(这个.prefix, key)'和Cachecler'正确的前缀appId'。 只有"清楚"两个都丢弃。 阅读课目 'cache Captain. role. clear ()' 似乎可以清除被缓存的角色 。

PurgeRouter.js'通过cacheAdapter.user.clear()'和`cacheAdapter.role.cle()'达到同一代码路径。

QQ 影响 1: 每个 QQRole 写入整个缓存无效, 包括所有会话

这不需要错误的配置和攻击者。 许多应用程序写作"QQRole"作为普通操作的一部分,比如在注册时创建每个组织,工作空间,团队或项目的作用. 每个写出 ** ** 所有 ** 缓存的条目, 包括 QQappId >: user: ` 条目, 后端会话认证 。 因此,在每次冲出之后,都会对数据库进行不间断的会话检查。

在任何有意义的角色创建速率上,缓存被持续地被破坏,永远无法为任何服务,这完全违背了配置共享缓存适配器的目的. 清除角色子缓存不应使用户会话失效 。

影响2:销毁无关数据 . . . . . . .

内容来源: parse-community/parse-server