防范越权访问需在身份认证、接口调用、数据查询、行为审计四环节闭环校验“谁、在什么条件下、能对哪条数据、执行什么操作”,禁用前端隐藏与宽泛角色,强制服务端四重校验及数据层自动过滤,并持续扫描、留痕、审计。

防范权限溢出与越权访问,核心不是堆砌规则,而是把“谁、在什么条件下、能对哪条数据、执行什么操作”这四件事,在身份认证、接口调用、数据查询、行为审计四个环节全部闭环校验。只做前端隐藏、只靠角色名控制、或仅在入口加个登录判断,都挡不住真实攻击。
明确权限边界:从资源归属和动作类型入手
越权问题常源于模糊的“我能进这个页面”,而非清晰的“我只能改自己名下的订单”。必须将权限拆解为可验证的最小单元:
- 每类业务资源(如客户、合同、审批单)需绑定明确归属字段,例如 owner_id、department_id 或 tenant_id
- 每个敏感操作(导出、删除、审批、配置修改)需单独定义动作权限,不能混同于“查看”
- 避免使用“管理员”“普通用户”等宽泛角色名;改为“区域销售-数据查看”“项目负责人-任务编辑”等带上下文的细粒度角色
服务端强制校验:拒绝一切未经验证的请求
前端按钮是否显示、菜单是否可见,完全不可信。所有关键接口必须在服务端完成四重校验:
- 身份有效性:检查 Token 是否未过期、签名是否合法、会话是否活跃
- 功能权限:当前用户是否拥有该接口所需的功能权限(如 hasPermission("order:export"))
- 资源归属:若请求含 ID 参数(如 /api/orders/123),必须查库确认该订单 owner_id 等于当前用户 ID
- 操作范围:若用户请求跨部门导出,需额外校验其角色是否具备对应组织维度权限(如 department_scope IN ('A','B'))
数据层自动过滤:让越权查询根本查不到
即使上层漏判,数据库也应兜底。不能依赖业务代码手动拼接 WHERE 条件,而要通过统一机制注入权限约束:
- 在 DAO 层或 ORM 拦截器中,根据当前用户动态添加租户/归属过滤条件,例如:
SELECT * FROM customers WHERE status = 'active' AND owner_id = ? - 对多租户系统,强制所有查询包含 tenant_id = #{currentTenantId};对内部系统,强制包含 department_id IN (SELECT ...)
- 敏感字段(身份证、手机号、银行卡号)默认不返回,需显式申请字段级授权才纳入结果集
持续验证与快速响应:把防护变成日常动作
权限策略不是上线就一劳永逸的事,必须嵌入运维闭环:
- 每季度运行自动化越权扫描:用测试账号模拟水平越权(改ID查他人数据)、垂直越权(低权限调高危接口),生成风险清单
- 所有权限变更走工单流程,留痕可追溯;临时权限设置有效期(如2小时),超时自动失效
- 关键操作(如导出500+客户、删除合同、修改权限配置)触发实时审计日志,并接入UEBA系统识别异常模式(如非工作时间高频导出)

















