Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何避免在用户定义函数中使用JavaScript eval()_Javascript_Json_Eval - Fatal编程技术网

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

如何避免在用户定义函数中使用JavaScript eval(),javascript,json,eval,Javascript,Json,Eval,我正在尝试制作一个通用的桌面RPG助手web应用程序。它必须是通用的,因为海岸巫师非常保护他们的版权。因此,为了避免停止和停止,系统必须能够加载任意规则。也就是说,我和我的朋友(以及大多数其他用户)将使用它进行D&D 在D&D中,修改器基于角色的统计信息。要得到一个修改器,你需要统计,减去10,除以2,然后向下取整 function getModifier(statValue) { return Math.floor((statValue - 10) / 2); } 我的应用程序将能够

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

在D&D中,修改器基于角色的统计信息。要得到一个修改器,你需要统计,减去10,除以2,然后向下取整

function getModifier(statValue) {
    return Math.floor((statValue - 10) / 2);
}
我的应用程序将能够从.json文件加载游戏规则。我希望能够使这个修饰符函数用户可定义。最简单的方法是只使用
eval()
它们在.json文件中提供的任何内容,但由于安全问题,这显然是一个糟糕的想法

不幸的是,我想不出一个简单的方法来安全地解决这个问题。显然,我可以编写自己的解析器,但这比我目前想要/能够做到的要复杂得多


想法?

解决问题的一个方法是使用


您可以在单独的页面上以有限的权限运行用户代码,这样代码就不会干扰应用程序的其余部分。您可以使用和
窗口与沙盒页面进行通信。首先,在消息上,请记住这都是客户端的。只要您信任JSON(它来自您的服务器或与应用程序一起控制),然后您可以使用它。这并不完全排除某些插入恶意规则的特洛伊木马,但我认为僵尸网络还没有学会玩D&D

为了避免eval并提供少量安全性,您可以使用。它包含一个参数名列表,后跟函数体,允许您大量控制函数的定义方式和引用位置。您只需将函数体存储在JSON文件中,就可以在很大程度上控制参数并使其难以分配到全局范围,从而大大减少了攻击面(如现在的攻击面)


如果你想玩这个,现在你的规则在很大程度上是数学的,你可以考虑使用一个工具来为你的规则生成一个解析器。计算器是解析器和编译器的经典介绍之一,所以这可能是一个玩一些有趣的技术的机会。JS项目中的se(我有)。

在我看来,有两个选项。第一,如果100%希望在.json中定义函数,则需要解析.json不允许函数,因此需要将函数存储为字符串并对其求值


更好的方法是还提供config.js功能。
.json
可能会有一个
“configUrl”:
属性,然后公开众所周知的API,例如
RPGHelper.setmodifier(someFunction)
,您可以从config.js文件中调用。然后用户可以自由定义任意逻辑。

我在谷歌上快速搜索了一下,找到了两个选项-和


顺便说一句,编写自己的解析器并不是那么困难。您可以用不到100行代码编写一个足以满足您需要的解析器

使用
JSON.parse
。JSON不定义函数。
JSON.parse()
将获取json文件并返回一个javascript对象,对吗?然后getModifier值将是一个字符串,我需要解析该字符串以获得函数。由于用户可以为该值输入任意字符串,我如何以安全的方式做到这一点?我不确定我是否理解修饰符是什么。您能给出几个示例吗用户定义的修饰符?我在谷歌上快速搜索了一下,找到了两个选项——SpiderPig似乎找到了您需要的东西。使用
新函数
定义的函数是否可以访问像XHR这样的对象和像
$
jQuery
这样的全局赋值,或者只有传递的参数?它们可以通过
窗口访问这些参数.$
,但您可以尝试在某种程度上混淆它们(例如,将代码添加到函数的头部,将它们全部定义为null)但是,作为客户端,安全性永远不会是绝对的。我认为OP的问题在于如何允许类似函数的定义,同时消除或沙盒其他用户定义的函数中可能发生的任何不好的东西。