面试题答案
一键面试代码编写规范
- 避免直接修改原型
- 禁止在运行时随意向
Object.prototype
、Array.prototype
等全局原型对象添加属性。例如,以下代码是不允许的:
Object.prototype.newProp = 'new value';
- 如果确实需要为自定义类添加方法,建议在类的定义内部使用
class
语法的方法定义,而不是直接操作原型。例如:
class MyClass { myMethod() { return 'This is my method'; } }
- 禁止在运行时随意向
- 使用严格模式
- 在JavaScript文件开头添加
'use strict';
。严格模式会禁止一些可能导致原型链污染的操作,比如给不可扩展的对象添加属性等。例如,在严格模式下,以下代码会抛出错误:
'use strict'; Object.preventExtensions({}); Object.prototype.newProp = 'new value'; // 抛出TypeError
- 在JavaScript文件开头添加
- 参数验证
- 对于接收对象作为参数的函数,要严格验证对象的属性。例如:
function processObject(obj) { if (typeof obj!== 'object' || obj === null) { throw new Error('Expected an object'); } // 检查对象的属性是否符合预期,假设只允许有 'name' 和 'age' 属性 const allowedProps = ['name', 'age']; Object.keys(obj).forEach(prop => { if (!allowedProps.includes(prop)) { throw new Error(`Unexpected property: ${prop}`); } }); // 处理对象逻辑 }
运行时检测
- 自定义检测函数
- 编写一个函数来检测对象是否有可疑的原型链污染。例如:
function detectPrototypePollution(obj) { const protoProps = Object.getOwnPropertyNames(Object.prototype); const objProps = Object.getOwnPropertyNames(obj); const suspectProps = objProps.filter(prop => protoProps.includes(prop)); if (suspectProps.length > 0) { console.warn('Possible prototype pollution detected:', suspectProps); return true; } return false; }
- 可以在关键的代码点,比如模块初始化时,调用这个函数对关键对象进行检测。
- 使用工具库
- 可以引入一些专门检测原型链污染的工具库,如
js - prototype - pollution - detector
。这些工具库通常会在运行时扫描代码,检测是否存在原型链污染的风险,并提供详细的报告。使用时,按照工具库的文档进行配置和集成,例如在项目的构建脚本或启动脚本中引入检测逻辑。
- 可以引入一些专门检测原型链污染的工具库,如
代码审查
- 定期审查
- 建立定期的代码审查机制,团队成员互相审查代码,重点关注涉及对象操作、原型操作的代码部分。特别是在合并代码分支之前,要确保没有引入可能导致原型链污染的代码。
- 审查工具辅助
- 利用代码审查工具,如GitHub的Pull Request审查功能,在审查过程中标记出可能存在原型链污染风险的代码片段,并要求开发者进行修改或给出合理的解释。