javascript - 如何检查函数是否为纯函数?

标签 javascript node.js

我正在研究 react-metaform ,我的挑战之一是我需要允许最终用户将元数据定义为函数。示例:

socialSecurityNumber.required: (m) => m.type == 'person'

问题很明显:我不能信任用户。因此,这些是我计划采取的预防措施:

  • 用户定义的函数应该是纯函数。从某种意义上说,这些函数只能访问它们的参数,不能访问其他任何内容。
  • 用户定义的函数将在对异常、执行时间过长和无限循环具有弹性的环境中运行。 (我现在不担心这个)。

问题是:如何确保用户定义的函数只访问它的参数而不访问其他内容?

最佳答案

我会使用 esprima解析存储在文件或数据库中的用户 JavaScript 函数。而且我只允许运行通过解析测试的代码(仅列入白名单的功能——使用局部变量、参数……)。

您可以从只允许非常有限的脚本的非常简单的检查代码开始,然后逐步改进它。但是,我猜你会随着时间的推移为解决方案付出很多努力,因为你的用户总是想要更多。


注意:Angular.js 使用这种“技巧”进行依赖注入(inject):https://jsfiddle.net/987Lwezy/

function test() {
   console.log("This is my secret!");
}


function parser(f) {
    document.body.innerHTML = test.toString();
}

parser(test);

关于javascript - 如何检查函数是否为纯函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33107719/

相关文章:

javascript - 让 Angular-socket-io 与 Grunt 一起工作

javascript - 如何通过 grunt & jasmine 设置 PhantomJS 的视口(viewport)大小?

javascript - 在 n 个字符后拆分输入以与字典对应

php - PHP 正则表达式和 JavaScript 正则表达式之间的区别

javascript - 从 DOM 解析 HTML

node.js - 在Docker上进行postinstall的Bower依赖

javascript - Node.js nvm 和 npm 目录结构

javascript - 如何在我当前的 chrome 中使用 puppeteer(保留我的凭据)

javascript - 如何将三维数组分割为三个 for in 循环?

node.js - 使用 PUSH 时无法理解 node.js 结果