用途
该技能用于审查 Convex 应用的安全审计模式,聚焦身份认证(authentication)与授权(authorization)。适用于审计查询/变更的认证、行级安全(row-level security)以及校验器(validators)。
主要能力
技能围绕 Convex 的常见安全缺陷给出正反示例与修复建议,涵盖以下方面:
认证检查
Convex 函数默认公开,每个查询和变更都可被任意客户端调用,除非添加认证检查。技能演示了未认证函数的风险,例如任何人都能读取全部用户或删除任意文档。修复方式是先调用 getAuthUserId(ctx) 并检查是否为空。对于使用第三方认证(Clerk、Auth0)的情况,技能指出仅检查 ctx.auth 存在是错误的,identity 可能为 null,应正确校验 identity 后再使用 identity.subject 过滤数据。
授权与 IDOR 问题
认证(你是谁)不等于授权(你能访问什么)。技能展示了 IDOR 场景:已登录用户可读取任意笔记,因为只做了认证而未做所有权检查。修复方式是获取文档后校验 note.userId 是否等于当前用户,不匹配时抛出“Not found”以避免泄露存在性。对于团队/组织成员,技能指出不能信任客户端传入的 teamId,应先查询 teamMembers 验证成员关系。
自定义函数模式(推荐)
技能推荐使用 convex-helpers 的 customQuery/customMutation 来默认强制认证,使 ctx.user 保证存在,并建议审计时检查是否一致使用自定义函数,搜索原始 query( 和 mutation( 的使用。
输入校验
技能指出缺少校验器时 args 为 any,可能插入任意内容;应使用严格校验器。同时强调不能信任客户端提供的 userId 用于所有权,userId 应由服务端从认证上下文获取。
内部函数
敏感逻辑不应放在公开变更中,应使用 internalMutation,仅允许其他服务端函数调用;公开函数校验后再通过 ctx.runMutation 调用内部函数。
HTTP 动作
HTTP 端点若无认证存在风险,应验证 webhook 签名,签名不匹配时返回 401。
实时订阅泄露
返回整个集合的订阅可能造成数据泄露,应按用户访问权限过滤,例如先查询用户所属频道再过滤消息。
环境变量
环境变量仅在 actions 中可用,不在查询/变更中可用(为保持确定性)。应通过 npx convex env set 设置,并在 action 中检查是否存在。
使用方式
技能提供严重性汇总表,列出问题、查找位置与严重级别,例如:查询/变更无认证检查为 CRITICAL;IDOR、客户端提供 userId、缺少校验器、公开函数承载内部逻辑、HTTP 动作无认证为 HIGH;订阅数据泄露、未使用自定义函数为 MEDIUM。
技能还提供快速审计命令,使用 rg 搜索公开查询与变更、缺少认证检查的函数、客户端提供的 userId、缺少校验器的函数、HTTP 动作以及内部与公开函数的使用情况。
最后提供加固检查清单,包括:所有查询/变更都有认证检查或使用自定义函数;文档访问包含所有权/成员关系验证;userId 来自认证上下文而非客户端参数;所有函数有适当校验器;敏感操作使用 internalMutation/internalAction;HTTP 动作验证签名/令牌;实时订阅按用户访问过滤;一致使用自定义函数;ESLint 规则阻止导入原始 query/mutation。
适用场景
适用于对 Convex 后端进行安全审计、代码审查或加固,尤其是检查认证、授权、输入校验和 Convex 特有漏洞时。
限制
资料未提供该技能的安装命令、运行方式、平台支持、收费或价格信息,这些内容暂未提供。