直接从 JSON 评估代码,这是个坏主意还是有更好的方法?

分享于2022年11月15日 electron eval javascript json 问答
【问题标题】:Evaluating code directly from JSON, bad idea or is there a better way?直接从 JSON 评估代码,这是个坏主意还是有更好的方法?
【发布时间】:2022-08-23 01:57:05
【问题描述】:

本质上,我正在使用 Electron 内部的 JavaScript、CSS、HTML 等制作游戏,以便我可以轻松访问本地文件。游戏将完全是本地和离线的。永远不要与服务器建立任何类型的连接。

但我的想法本质上是小的独立故事,它们被加载到玩家可以选择的池中,只需将它们放入一个文件夹中,它们就会包含在游戏中。我为此使用了 JSON 文件,但我也希望能够在故事模块启动时创建特定于故事模块的变量。

例如,我想为故事模块中的角色随机命名,所以在开始时:

\"do_at_start\" : \"story_variables.character_name = randomChoiceFunction(\'name1\', \'name2\', \'name3\')\"

我想这样做的原因是任何想要制作自定义 JSON 文件并以这种方式将它们放在游戏中的想法,而不是编写函数等来制作新模块。

我认为最简单的方法是在需要时在 JSON 值的字符串中输入 eval() 代码。这是一个本地应用程序,这仍然是一个坏主意吗?还是有其他方法也可以解决这个问题?理想情况下,我希望得到可以从头开始提出的建议作为一种练习,看看我是否可以从头开始编写类似的东西,但如果它们更容易实现,我仍然会接受其他方法的建议。

  • 我个人不推荐这种方法,因为您将允许人们共享他们的 json,并且有些人可能会将恶意代码包含到他们的 json 中,然后通过 eval 执行这些代码。相反,您可以提供作为玩家最终可以调整的选项数组的属性,如果共享则没有任何风险? (例如: \"possibleNames\" : [ \"name1\", \"name2\", \"name3\"]
  • 当变量只是一个随机选择但我希望做的不仅仅是那个时,这很有效。例如,如果某种值为真,则选择某些变量。
  • 没错,我的例子是为一个非常简单的案例设置的。对于取决于值的选择,您可以通过设置具有属性的对象而不是数组中的字符串,并添加可与本机 Array.filter() 或其他类似方法一起使用的属性(也可以是加权选择)。这不会将您限制为仅随机选择,并且还可以对玩家可以使用 json 操作进行的操作保持一些控制/安全性。如果您可以共享一个 json 模板和集成它的代码,这可能也会帮助人们帮助您:)

【解决方案1】:

您所描述的似乎是一种完全合理的方式,可以让您的应用程序本质上是一个修改 API。 Chromium(电子所基于的)具有相当强大的安全模型,所以我不会太担心恶意代码的风险。

如果您真的担心强化攻击面,请确保您使用 follow the electron security best practices ,并直接考虑 disabling network access 和/或 limiting the app to a single folder 。 (作为示例提供的 SO 链接,但您可能需要寻找其他实现)。

另一种选择是构建一个完整的自定义解析器,其中包含您可能想要使用的每个函数。您将扫描和替换输入文件中的预定义宏。如果您想继续前进,我建议您查看 Sugarcube 的方式。

【讨论】: