最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何防范攻击者通过原型方法恶意篡改内置链进而绕过文件读写控制
时间:2026-06-19 09:46:58 编辑:袖梨 来源:一聚教程网
必须服务端鉴权文件操作——前端拦截无效,原型污染可绕过权限判断;应冻结关键原型、内联白名单校验,并在服务端校验资源级权限与文件元数据。
不能靠前端拦截文件读写操作来防绕过——所有客户端的“禁止上传”“禁用下载按钮”都只是界面提示,真正的控制权必须落在服务端。攻击者根本不需要动原型链,直接在控制台调用 fetch 或 XMLHttpRequest 就能绕过任何前端限制。原型链相关风险,主要集中在污染导致逻辑误判或方法失效,而非直接打开文件系统权限。
真正要防的是原型污染干扰权限判断逻辑
如果前端用了类似 if (user.hasFileAccess()) 或 canRead(file.type) 这类 JS 判断,并把它当作是否允许发起请求的依据,那攻击者就可能通过污染 Object.prototype 或 Array.prototype 让这些函数始终返回 true:
-
污染
Object.prototype:执行Object.prototype.hasFileAccess = () => true,让所有对象都“自带权限” -
覆盖
Array.prototype.includes:让白名单校验(如['pdf', 'txt'].includes(ext))永远返回true -
劫持
String.prototype.endsWith:使filename.endsWith('.jpg')对任意后缀都返回true
冻结关键原型 + 隔离敏感逻辑
在页面加载最早期(<script> 标签顶部、第三方脚本之前)执行:
Object.freeze(Object.prototype)Object.freeze(Array.prototype)Object.freeze(String.prototype)Object.freeze(Function.prototype)
同时,所有与文件类型、扩展名、MIME 类型相关的校验逻辑,不要写成可被覆盖的方法调用,而应使用内联表达式或硬编码白名单,例如:
✅ 推荐const allowed = ['pdf', 'docx', 'xlsx'];<br>return allowed.some(ext => filename.toLowerCase().endsWith('.' + ext));
❌ 避免
return filename.endsWith('.pdf') || filename.endsWith('.docx');(易被劫持)文件操作必须走服务端鉴权
前端只负责收集用户意图(如点击“下载报告”),不决定能否执行。每次请求都需携带明确上下文:
- 请求路径中包含资源唯一标识(如
/api/files/abc123/download) - 服务端查该用户对
abc123是否有读权限(非角色判断,而是具体资源级授权) - 服务端校验文件元数据(存储路径、真实 MIME、扩展名、大小)是否匹配预期
- 拒绝响应未签名或过期的预签名 URL,不信任前端传来的任何“已校验”标志
运行时轻量检测异常行为
可在关键操作前加一次快速校验,不阻断流程但可告警:
- 检查
String.prototype.endsWith是否仍为原生函数:typeof ''.endsWith === 'function' - 验证空数组的
includes行为:[].includes.call(['a'], 'a') === true - 发现异常时记录日志并上报,不中断用户,但触发后台风控标记该会话
相关文章
- 商汤日日新开发者免费使用:模型选择、令牌额度与调用说明 06-19
- 2026拼图游戏app哪些值得下载 质量高的拼图游戏app大全 06-19
- 米姆米姆哈id是否能重复 06-19
- 商汤日日新开发者注册与登录:账号配置与权限说明 06-19
- 商汤日日新开发者账号权限:配置要点与适用范围 06-19
- 商汤日日新开发者入口在哪?Token领取与API权限配置说明 06-19