MST

星途 面试题库

面试题:在复杂的JavaScript应用中,使用class关键字定义类,如何有效避免原型链污染带来的安全风险?

在一个大型JavaScript项目中,有多个模块使用class定义类,且存在多层继承关系。已知原型链污染可能导致安全漏洞,详细阐述你会采取哪些策略和方法来全面排查和防范原型链污染问题,比如在代码编写规范、运行时检测等方面给出具体措施。
20.9万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

代码编写规范

  1. 避免直接修改原型
    • 禁止在运行时随意向Object.prototypeArray.prototype等全局原型对象添加属性。例如,以下代码是不允许的:
    Object.prototype.newProp = 'new value';
    
    • 如果确实需要为自定义类添加方法,建议在类的定义内部使用class语法的方法定义,而不是直接操作原型。例如:
    class MyClass {
        myMethod() {
            return 'This is my method';
        }
    }
    
  2. 使用严格模式
    • 在JavaScript文件开头添加'use strict';。严格模式会禁止一些可能导致原型链污染的操作,比如给不可扩展的对象添加属性等。例如,在严格模式下,以下代码会抛出错误:
    'use strict';
    Object.preventExtensions({});
    Object.prototype.newProp = 'new value'; // 抛出TypeError
    
  3. 参数验证
    • 对于接收对象作为参数的函数,要严格验证对象的属性。例如:
    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}`);
            }
        });
        // 处理对象逻辑
    }
    

运行时检测

  1. 自定义检测函数
    • 编写一个函数来检测对象是否有可疑的原型链污染。例如:
    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;
    }
    
    • 可以在关键的代码点,比如模块初始化时,调用这个函数对关键对象进行检测。
  2. 使用工具库
    • 可以引入一些专门检测原型链污染的工具库,如js - prototype - pollution - detector。这些工具库通常会在运行时扫描代码,检测是否存在原型链污染的风险,并提供详细的报告。使用时,按照工具库的文档进行配置和集成,例如在项目的构建脚本或启动脚本中引入检测逻辑。

代码审查

  1. 定期审查
    • 建立定期的代码审查机制,团队成员互相审查代码,重点关注涉及对象操作、原型操作的代码部分。特别是在合并代码分支之前,要确保没有引入可能导致原型链污染的代码。
  2. 审查工具辅助
    • 利用代码审查工具,如GitHub的Pull Request审查功能,在审查过程中标记出可能存在原型链污染风险的代码片段,并要求开发者进行修改或给出合理的解释。