我正在研究 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/