首页 > 解决方案 > 关于使用 JavaScript Function 构造函数作为沙箱的问题

问题描述

用例

我需要运行一些用户提交的 JavaScript,它将与只包含数据和 API 函数的 API 对象进行交互。我期望用户提交的代码具有简单的线性逻辑,它将仅使用 API 对象提供的数据作为输入,并将输出写入 API 对象。

我的计划

const userSubmittedCode = //get it from somewhere

// If user code contains keywords like 'this', 'prototype', 'constructor', etc, do not continue.
// (Basically anything that the user won't need but seems dangerous)

const callUserCode = Function(
    "apiObject", 
    "const globalThis = window = document = {}; // + anything I want to hide" + userSubmittedCode);
callUserCode(myAPIObject);

// Do things according to myAPIObject's internal state.

我对 JavaScript 不是很熟悉,也不确定这是否足够(现在并不真正关心内存耗尽和超时攻击)。任何想法都会受到欢迎。

提前致谢。

标签: javascript

解决方案


您可以将不希望字符串包含的关键字存储在数组中,并用于Array.some检查字符串是否包含以下项之一:

const bannedKeywords = ['this', 'prototype', 'constructor']

function isSafe(str){
   return !bannedKeywords.some(e => str.includes(e))
}

console.log(isSafe('a'))
console.log(isSafe('this'))


推荐阅读