Laravel 5.4如何防止不同角色越权访问其他角色的专属功能?
修复库存管理应用的越权访问漏洞
嘿,这个问题是典型的垂直越权漏洞——你只在前端做了菜单显示的限制,但低权限角色(比如操作员)完全可以通过直接输入URL绕过前端限制,访问高权限功能。前端的菜单隐藏只是给用户看的,根本不能作为权限控制的核心,必须在后端做强制校验才行。
下面是具体的修复方案,按优先级来:
- 后端路由级权限拦截(核心):给每个受保护的路由(比如
/admin/backupAndRestore)加上权限校验逻辑。每次请求过来,先从会话(Session)或者用户Token里拿到当前用户的角色,判断是否有访问该路由的权限,没有的话直接返回403禁止访问,或者跳转到无权限提示页面。
给你写个伪代码示例,方便理解:# 以Flask为例的路由权限校验 @app.route('/admin/backupAndRestore') def handle_backup_restore(): # 从会话中获取当前用户的角色信息(必须从后端可信源获取,不能信前端传的) current_user_role = session.get('user_role') # 只有管理员和超级管理员能访问 if current_user_role not in ['admin', 'super_admin']: return "抱歉,你没有权限访问此功能", 403 # 执行备份恢复的业务逻辑 return render_template('backup_restore.html') - 统一权限配置管理:建议把角色、权限、资源(路由/功能)做统一的配置,比如用一个数据库表或者配置文件,记录每个角色能访问的路由列表。这样后续新增角色或者功能时,只需要更新配置,不用改一堆业务代码,维护起来更方便。
- 前端辅助校验(提升体验):虽然后端校验是核心,但前端也可以加一层辅助拦截,比如在路由跳转前先判断当前角色是否有对应权限,避免用户点了之后才跳转到403页面,提升用户体验。但记住,这只是补充,绝对不能替代后端的校验。
- 会话与Token安全加固:确保用户的角色信息存在后端的会话里,或者用JWT Token的话,一定要对Token做签名(防止用户篡改Token里的角色信息),不能让前端随便修改角色值来绕过校验。
还有几个细节要注意:
- 绝对不要依赖前端传递的角色信息做校验,必须从后端可信的数据源(比如数据库、后端会话存储)获取当前用户的真实角色。
- 修复后一定要做测试:用操作员账号尝试直接访问
/admin/backupAndRestore,看看是不是会被拦截;用管理员账号访问则正常,确保校验逻辑生效。
补充一句:你遇到的这个误区很常见——很多开发者一开始只关注前端的菜单展示,忘了后端才是权限控制的关键。前端的任何限制都可以被用户轻松绕过,后端的校验才是真正的安全防线。
内容的提问来源于stack exchange,提问作者Indra Sukmajaya
相关产品推荐
相关产品推荐

