不能靠检查 constructor 属性防篡改,因其可写且无防护能力;应冻结原生原型、过滤危险键名、避免污染型合并、监控原型完整性、权限校验交由后端。

不能靠检查 constructor 属性来防止第三方代码篡改核心原型链。
constructor 是一个普通可写属性,它不参与原型链的结构维护,也不具备防护能力。它只是历史遗留的类型提示字段,既不可信,也无法阻止任何篡改行为。把防御寄托在 constructor 上,就像用门牌号防小偷——牌子可以被撕、被涂改、被贴假标签,完全无法阻挡入侵。
真正有效的防护,是切断篡改路径、冻结关键对象、过滤危险输入。以下是实际可行的做法:
尽早冻结原生构造函数的 prototype 对象
这是最直接有效的防线。在任何第三方脚本执行前,就锁定核心原型的状态:
Object.freeze(Object.prototype); Object.freeze(Array.prototype); Object.freeze(String.prototype); Object.freeze(Number.prototype); Object.freeze(Boolean.prototype); Object.freeze(Function.prototype); Object.freeze(Date.prototype); Object.freeze(RegExp.prototype);
这些操作让原型对象自身不可扩展、不可删除属性、不可修改属性描述符。注意:必须放在 最顶部(浏览器)或入口文件第一行(Node.js),晚一秒都可能失效。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
过滤用户输入中的危险键名
第三方代码常通过 __proto__、constructor、prototype 等键名触发原型污染。处理 JSON 或配置对象时,主动剔除或拒绝这些键:
function sanitize(obj) {
if (obj == null || typeof obj !== 'object') return obj;
if (Array.isArray(obj)) return obj.map(sanitize);
const cleaned = {};
for (const key in obj) {
if (key === '__proto__' || key === 'constructor' || key === 'prototype') continue;
cleaned[key] = sanitize(obj[key]);
}
return cleaned;
}
更稳妥的方式是使用白名单机制,只保留明确允许的字段。
避免使用污染风险高的合并方法
像 _.merge()、Object.assign()、JSON.parse(JSON.stringify()) 都可能触发原型链污染。推荐改用:
-
structuredClone()(现代环境,支持__proto__自动忽略) -
Object.create(null)创建无原型的对象作为配置容器 - 手动递归拷贝 + 键名黑名单校验
运行时监控原型是否已被污染
冻结后仍需验证是否生效,并检测是否有异常属性注入:
function checkPrototypeIntegrity() {
const unsafeKeys = ['isAdmin', 'isSuperAdmin', 'bypassAuth', '__evil'];
for (const key of unsafeKeys) {
if (Object.prototype.hasOwnProperty(key)) {
console.warn(`[SECURITY] Object.prototype polluted with ${key}`);
// 触发告警、上报、或强制刷新
}
}
}
定期或在关键操作前调用该函数。
前端权限逻辑不依赖 constructor 或原型状态
所有权限判定必须由服务端完成。前端只做渲染映射,例如:
// ✅ 正确:仅控制 UI 显示,不决定行为
if (userScopes.includes('user:delete')) {
deleteBtn.style.display = 'inline';
}
// ❌ 危险:不能靠这个发起请求
if (someObj.constructor === User) { /* 发起删除 */ } // 可被轻易绕过
真正的删除请求必须携带完整上下文,由后端校验“当前用户对这个 ID 是否有删除权”。
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










