
1) 【一句话结论】我修复了一个因权限校验逻辑缺失导致的越权访问漏洞,通过重构接口权限控制逻辑并补充用户ID类型和空值校验,有效防止了用户数据被非授权访问,提升了系统安全性。
2) 【原理/概念讲解】越权访问(Unauthorized Access)是指用户以非授权身份访问或操作他人数据或资源。核心原因是系统权限控制机制失效,比如接口未验证请求中用户身份与目标资源的归属是否匹配。类比:小区保安本应只允许住户进入自家,若保安未检查身份,让住户A进入了住户B的家,这就是越权。常见于API接口、用户管理模块等,因开发时忽略权限校验导致。
3) 【对比与适用场景】
| 漏洞类型 | 定义 | 核心问题 | 常见场景 | 注意点 |
|---|---|---|---|---|
| 越权访问 | 用户越权访问他人数据/资源 | 权限控制失效 | 用户管理接口、数据查询API、资源访问接口 | 需关注身份与资源的匹配校验 |
| 信息泄露 | 敏感数据被非授权方获取 | 数据加密或传输安全不足 | 未加密的日志、明文存储密码、不安全的API返回 | 需关注数据传输和存储的安全性 |
4) 【示例】假设有一个用户数据查询接口,伪代码:
漏洞版本:
# 伪代码:漏洞版本的接口
def get_user_info(user_id, target_user_id):
# 漏洞:未校验user_id是否等于target_user_id,且未处理空值和类型不一致
if not user_id or not target_user_id:
return {"error": "参数错误"}
sql = f"SELECT * FROM user_info WHERE user_id = {target_user_id}"
return db.execute(sql).fetchall()
当用户A(user_id=1)调用get_user_info(1, 2),会返回user_id=2的用户信息,导致越权。
修复后:
def get_user_info(user_id, target_user_id):
# 校验用户ID类型和空值
if not isinstance(user_id, int) or not isinstance(target_user_id, int):
return {"error": "参数类型错误"}
if user_id != target_user_id:
return {"error": "无权访问"}
sql = f"SELECT * FROM user_info WHERE user_id = {target_user_id}"
return db.execute(sql).fetchall()
5) 【面试口播版答案】面试官,我分享一次修复越权访问漏洞的经验。项目里有一个用户数据查询接口,用户A可以访问用户B的敏感信息。我发现是因为接口没有校验请求中用户身份与目标用户是否一致,还忽略了用户ID类型和空值的边界情况。分析时,我用Postman模拟不同用户调用,发现A能获取B的数据,同时测试了空值和类型错误的情况。修复方案是将校验逻辑加在接口入口,先校验用户ID是否为整数且不为空,再检查request.user.id == target_user_id,然后补充单元测试用例,覆盖正常(授权用户访问)、越权(非授权用户调用)、空值(user_id为空)、类型错误(user_id为字符串)等场景。测试验证时,用不同用户测试,确认只有授权用户能访问,修复后漏洞被成功关闭,系统安全性提升。
6) 【追问清单】
7) 【常见坑/雷区】