影响文件:backend/app/core/base_crud.py
问题描述:
clear()(行 370-402)WHERE 条件仅有租户隔离,连主键过滤都没有:
clear() — 行 393
sql = update(self.model).where(
*self.__tenant_condition() # 仅租户隔离,无主键无 data_scope
).values(**update_data)
任何能调用 clear 端点的用户可以直接软删除同租户下的全部数据。即使是 data_scope=1(仅本人数据)的用户也能清空整个表。
另外,对于不支持软删除的模型,clear() 走物理删除但同样没有任何权限过滤(行 398):
sql = delete(self.model) # 无任何 WHERE
await self.auth.db.execute(sql)
复现步骤:
- 创建有 module_system:xxx:delete 菜单权限的普通用户,data_scope=1
- 调用 DELETE /xxx/clear
- 同租户下所有 xxx 记录被软删除(或物理删除)
建议修复:
追加数据权限条件。如果 clear() 的预期语义是"仅清除用户有权限的数据",直接用 Permission 条件即可;如果 clear() 应仅限超级管理员,建议增加 is_superuser 校验:
if self.auth.user and not self.auth.user.is_superuser:
raise CustomException(msg="仅超级管理员可执行清空操作")
影响文件:backend/app/core/base_crud.py
问题描述:
clear()(行 370-402)WHERE 条件仅有租户隔离,连主键过滤都没有:
clear() — 行 393
sql = update(self.model).where(
*self.__tenant_condition() # 仅租户隔离,无主键无 data_scope
).values(**update_data)
任何能调用 clear 端点的用户可以直接软删除同租户下的全部数据。即使是 data_scope=1(仅本人数据)的用户也能清空整个表。
另外,对于不支持软删除的模型,clear() 走物理删除但同样没有任何权限过滤(行 398):
sql = delete(self.model) # 无任何 WHERE
await self.auth.db.execute(sql)
复现步骤:
建议修复:
追加数据权限条件。如果 clear() 的预期语义是"仅清除用户有权限的数据",直接用 Permission 条件即可;如果 clear() 应仅限超级管理员,建议增加 is_superuser 校验:
if self.auth.user and not self.auth.user.is_superuser:
raise CustomException(msg="仅超级管理员可执行清空操作")