繁体   English   中英

如何避免在用户定义的函数中使用JavaScript eval()

[英]How to avoid using JavaScript eval() in user-defined function

我正在尝试制作一个通用的桌面RPG助手Web应用程序。 它必须是通用的,因为“海岸奇才”非常保护其版权。 因此,为了避免停下来,该系统必须能够加载任意规则。 就是说,我和我的好友(以及大多数其他用户)将使用它进行D&D。

在D&D中,修饰符基于角色的属性。 要获取修饰符,您需要获取统计信息,然后减去10,除以2,然后四舍五入。

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

我的应用程序将能够从.json文件加载游戏规则。 我希望能够使此修饰符功能可由用户定义。 最简单的方法是仅对.json文件中提供的内容进行eval() ,但是由于安全问题,显然这是一个糟糕的主意。

不幸的是,我想不出一种简单的方法来以安全的方式解决这个问题。 显然,我可以编写自己的解析器,但这要比我目前想要的更加复杂。

有想法吗?

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

为了从字面上避免评估并提供某种程度的安全性,可以使用new Function 它采用参数名称列表,然后是函数主体,使您可以大量控制函数的定义方式以及可以从何处引用函数。 您只需要将主体存储在JSON文件中,就可以在很大程度上控制参数并使其难以分配给全局范围,从而极大地减少了攻击面。

如果您希望以此为 ,现在您的规则基本上是数学的,则可以考虑使用诸如pegjs之类的工具来为规则生成解析器。 计算器是解析器和编译器的经典介绍之一,因此这可能是一个使用一些有趣的技术的机会。 由pegjs构建的规则和解析器在JS项目中非常易于使用(我有一个通过Babel使用PegJS和ES6的示例 )。

我做了一个快速的谷歌搜索,发现了两个选择-http : //mathjs.orghttp://jsep.from.so

顺便说一句 编写自己的解析器并不困难。 您也许可以用不到100行的代码编写一个足以满足您的目的的代码

解决您的问题的一种方法是使用沙盒iframe所有主要浏览器均支持该功能)

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM