如何通过 Object.freeze 彻底保护前端业务常量配置文件防止在运行时被第三方插件攻击

秋明酱_9901

秋明酱_9901

2026-04-17

989人浏览

原创

object.freeze仅浅冻结,需deepfreeze递归冻结+切断原型链+早于模块加载执行;否则第三方仍可修改嵌套属性或通过原型污染绕过。

如何通过 object.freeze 彻底保护前端业务常量配置文件防止在运行时被第三方插件攻击

Object.freeze 本身不能彻底防住第三方插件攻击,它只防误改,不防恶意覆盖、原型污染或绕过引用的操作;真正能起作用的是“冻结 + 切断原型 + 早于任何模块加载 + 配合模块封装”的组合动作。

为什么 freeze(config) 后第三方脚本还能改嵌套字段

因为 Object.freeze 是浅冻结:它只锁住 config 自身属性的 writable 和 configurable,但对 config.api、config.features 这类对象值不做处理。第三方脚本只要拿到 config.api 的引用,就能自由修改其内部字段——比如 config.api.timeout = 0 或 config.features.admin = true。

  • 常见误判:从 JSON 文件读取后直接 Object.freeze(config),以为万事大吉
  • 更危险的是:某些插件会用 Object.setPrototypeOf(config, null) 或 config.__proto__ = null 破坏冻结状态(虽然冻结后 setPrototypeOf 会失败,但若在 freeze 前已污染原型,就晚了)
  • 注意:config 被 freeze 后,config.api = {} 会失败,但 config.api.baseUrl = 'xxx' 依然成功

必须用 deepFreeze 递归冻结所有嵌套层级

手动实现一个安全的 deepFreeze,跳过原始值、函数、Date、RegExp 等非配置类对象,并用 WeakMap 防循环引用:

前端设计优化skill
前端设计优化skill

前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。

下载
function deepFreeze(obj) {
  if (obj === null || typeof obj !== 'object') return obj;
  if (obj instanceof Date || obj instanceof RegExp || typeof obj === 'function') return obj;

  const seen = new WeakMap();
  function _freeze(o) {
    if (o === null || typeof o !== 'object') return o;
    if (seen.has(o)) return o;
    seen.set(o, true);

    Object.getOwnPropertyNames(o).forEach(prop => _freeze(o[prop]));
    Object.getOwnPropertySymbols(o).forEach(sym => _freeze(o[sym]));
    return Object.freeze(o);
  }
  return _freeze(obj);
}
  • 不要用 JSON.parse(JSON.stringify()) 做深拷贝再 freeze——会丢掉函数、undefined、Symbol、循环引用,且性能差
  • 确保该函数在配置对象完全构造完毕后**立即调用**,不能等 export default 之后再 freeze
  • 如果配置里混入了 Map、Set 或 Promise,它们不属于 plain object/array,deepFreeze 不处理,也不该出现在常量配置中

冻结必须发生在模块加载链最顶端,且切断原型链

Node.js 或现代浏览器 ESM 中,冻结时机错误等于白做。一旦某个模块缓存了未冻结的引用(例如 const cfg = require('./config')),其他模块拿到的就是可变副本。

  • 在入口文件(如 index.js 或 main.ts)最顶部执行:import config from './config.js'; deepFreeze(config); export { config };
  • 浏览器中,若用 <script type="module"></script>,需在模块顶层立即执行 deepFreeze,不能包裹在函数或事件回调里
  • 为防原型污染,在 freeze 前加一句:Object.setPrototypeOf(config, null),让 config 脱离 Object.prototype,避免被注入 toString、valueOf 等钩子
  • 禁止导出时写成 export default Object.freeze({...})——打包器可能提前优化,导致其他模块拿到未冻结版本

仅靠 freeze 不足以对抗主动攻击,还需运行时防护层

即使完成深冻结和原型切断,恶意脚本仍可能通过以下方式破坏一致性:

  • 用 eval 或 Function 构造器动态执行代码,绕过静态冻结
  • 替换全局 Object.freeze 方法本身(虽然少见,但可行)
  • 篡改 console、fetch、XMLHttpRequest 等 API,伪造响应数据

所以生产环境建议叠加:Object.freeze + Object.preventExtensions(双重保险)+ ESLint 规则 no-param-reassign + no-const-assign + 在关键读取点加 Object.isFrozen(config) 断言(仅开发环境)。真正的防线不在冻结动作本身,而在冻结是否被绕过、是否被提前污染、是否与其他模块共享了同一份未冻结引用——这些细节比写对 deepFreeze 更容易出错。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

前端 配置文件

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2563

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

5543

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6570

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

6218

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

883

5

C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

3269

3

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

2023.07.25

2348

9

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

2023.08.02

1280

5

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.09

1238

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程