我正在尝试制作通用的桌面RPG助手网络应用。它必须是通用的,因为Wizards of the Coast非常保护他们的版权。因此,为了避免停止和停止,系统必须能够加载任意规则。也就是说,我和我的朋友(以及大多数其他用户)都会将它用于D& D.
在D& D中,修饰符基于角色的统计数据。要获得一个修饰符,你可以使用stat,减去10,除以2,然后向下舍入。
function getModifier(statValue) {
return Math.floor((statValue - 10) / 2);
}
我的应用程序将能够从.json文件加载游戏规则。我希望能够使这个修饰符功能用户可定义。最简单的方法是只在{。1}} .json文件中提供它们,但很明显,由于安全问题,这是一个糟糕的主意。
不幸的是,我无法想出以安全的方式解决这个问题的简单方法。显然我可以编写自己的解析器,但这比我现在能够做的更复杂。
想法?
答案 0 :(得分:1)
首先,请记住这一切都在客户端。只要您信任JSON(它来自您的服务器或它与应用程序本身一起控制),那么您就可以使用它。这并没有完全排除某些木马插入恶意规则,但我认为僵尸网络还没有学会玩D& D。
要字面避免使用eval并提供一些安全性,您可以使用new Function
。它采用参数名称列表,后跟函数体,允许您对函数的定义方式以及函数的引用进行大量控制。您只需要将主体存储在JSON文件中,从而允许您在很大程度上控制参数并使其难以分配到全局范围,从而最大限度地减少攻击面(例如它)。
如果你想玩得开心,现在你的规则基本上是数学的,你可以考虑使用像pegjs这样的工具为你的规则生成一个解析器。计算器是解析器和编译器的经典介绍之一,因此这可能是一个玩一些有趣技术的机会。 pegjs构建的规则和解析器在JS项目中非常容易使用(我有an example using PegJS and ES6 via Babel)。
答案 1 :(得分:1)
我进行了快速谷歌搜索,找到了两个选项 - this fiddle和http://mathjs.org
顺便说一句。编写自己的解析器并不困难。您可以在少于100行代码中编写一个足以满足您目的的
答案 2 :(得分:0)
问题的一个解决方案是使用sandboxed iframes(all major browsers支持的当前
您在具有有限权限的单独页面上运行用户代码,使代码不会干扰应用程序的其余部分。您可以使用postMessage()
和window.onmessage
与沙盒网页进行通信。
答案 3 :(得分:0)
我看到它有两个选项。一,如果你100%想要在.json中定义函数,你需要解析。 JSON不允许函数,因此您需要将函数存储为字符串并对其进行评估。
更好的方法是提供config.js功能。也许.json
将具有"configUrl":
属性,然后公开众所周知的apis,例如RPGHelper.setModifer(someFunction)
,您可以从config.js文件中调用它。然后,用户可以自由定义那里的任意逻辑。