Skip to content

CRUDBase.clear() 未校验 data_scope,用户可越权清空同租户全部数据 #447

@Unica7995

Description

@Unica7995

影响文件: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)

复现步骤:

  1. 创建有 module_system:xxx:delete 菜单权限的普通用户,data_scope=1
  2. 调用 DELETE /xxx/clear
  3. 同租户下所有 xxx 记录被软删除(或物理删除)

建议修复:

追加数据权限条件。如果 clear() 的预期语义是"仅清除用户有权限的数据",直接用 Permission 条件即可;如果 clear() 应仅限超级管理员,建议增加 is_superuser 校验:

if self.auth.user and not self.auth.user.is_superuser:
raise CustomException(msg="仅超级管理员可执行清空操作")

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions