如何避免在用户定义的函数

时间:2015-05-04 17:41:51

标签: javascript json eval

我正在尝试制作通用的桌面RPG助手网络应用。它必须是通用的,因为Wizards of the Coast非常保护他们的版权。因此,为了避免停止和停止,系统必须能够加载任意规则。也就是说,我和我的朋友(以及大多数其他用户)都会将它用于D& D.

在D& D中,修饰符基于角色的统计数据。要获得一个修饰符,你可以使用stat,减去10,除以2,然后向下舍入。

function getModifier(statValue) {
    return Math.floor((statValue - 10) / 2);
}

我的应用程序将能够从.json文件加载游戏规则。我希望能够使这个修饰符功能用户可定义。最简单的方法是只在{。1}} .json文件中提供它们,但很明显,由于安全问题,这是一个糟糕的主意。

不幸的是,我无法想出以安全的方式解决这个问题的简单方法。显然我可以编写自己的解析器,但这比我现在能够做的更复杂。

想法?

4 个答案:

答案 0 :(得分:1)

首先,请记住这一切都在客户端。只要您信任JSON(它来自您的服务器或它与应用程序本身一起控制),那么您就可以使用它。这并没有完全排除某些木马插入恶意规则,但我认为僵尸网络还没有学会玩D& D。

字面避免使用eval并提供一些安全性,您可以使用new Function。它采用参数名称列表,后跟函数体,允许您对函数的定义方式以及函数的引用进行大量控制。您只需要将主体存储在JSON文件中,从而允许您在很大程度上控制参数并使其难以分配到全局范围,从而最大限度地减少攻击面(例如它)。

如果你想玩得开心,现在你的规则基本上是数学的,你可以考虑使用像pegjs这样的工具为你的规则生成一个解析器。计算器是解析器和编译器的经典介绍之一,因此这可能是一个玩一些有趣技术的机会。 pegjs构建的规则和解析器在JS项目中非常容易使用(我有an example using PegJS and ES6 via Babel)。

答案 1 :(得分:1)

我进行了快速谷歌搜索,找到了两个选项 - this fiddlehttp://mathjs.org

顺便说一句。编写自己的解析器并不困难。您可以在少于100行代码中编写一个足以满足您目的的

答案 2 :(得分:0)

问题的一个解决方案是使用sandboxed iframesall major browsers支持的当前

您在具有有限权限的单独页面上运行用户代码,使代码不会干扰应用程序的其余部分。您可以使用postMessage()window.onmessage与沙盒网页进行通信。

答案 3 :(得分:0)

我看到它有两个选项。一,如果你100%想要在.json中定义函数,你需要解析。 JSON不允许函数,因此您需要将函数存储为字符串并对其进行评估。

更好的方法是提供config.js功能。也许.json将具有"configUrl":属性,然后公开众所周知的apis,例如RPGHelper.setModifer(someFunction),您可以从config.js文件中调用它。然后,用户可以自由定义那里的任意逻辑。