一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

如何防范攻击者通过原型方法恶意篡改内置链进而绕过文件读写控制

时间:2026-06-19 09:46:58 编辑:袖梨 来源:一聚教程网

必须服务端鉴权文件操作——前端拦截无效,原型污染可绕过权限判断;应冻结关键原型、内联白名单校验,并在服务端校验资源级权限与文件元数据。

不能靠前端拦截文件读写操作来防绕过——所有客户端的“禁止上传”“禁用下载按钮”都只是界面提示,真正的控制权必须落在服务端。攻击者根本不需要动原型链,直接在控制台调用 fetchXMLHttpRequest 就能绕过任何前端限制。原型链相关风险,主要集中在污染导致逻辑误判或方法失效,而非直接打开文件系统权限。

真正要防的是原型污染干扰权限判断逻辑

如果前端用了类似 if (user.hasFileAccess())canRead(file.type) 这类 JS 判断,并把它当作是否允许发起请求的依据,那攻击者就可能通过污染 Object.prototypeArray.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
  • 发现异常时记录日志并上报,不中断用户,但触发后台风控标记该会话

热门栏目