在Clojure中删除/白名单所有绑定

时间:2016-04-10 16:32:02

标签: binding clojure eval

在我的小游戏项目中,我希望玩家能够在游戏中操纵一些游戏内容来编写一些Clojure脚本。所以,我下载了Clojure lib并使用了这段代码:

private val eval = Clojure.`var`("clojure.core", "eval")

fun eval(code: String): Any? =
  try {
    eval.invoke(Clojure.read("(do $code)"))
  }catch(e: Exception) {
    e.printStackTrace()
    null
  }

但事实是,通过这样做,玩家可以操纵整个程序,因为它在与游戏代码相同的环境中运行。最简单的例子是(System/exit 0)

我的问题是 - 如何从我的脚本上下文中删除所有Clojure绑定,除了一些基本的预定义内容,如数学运算符,集合魔法等等?

另外,我可以使用eval.invoke("(def do-magic [x] (println "magic"))")将自己的绑定(用于将这些脚本连接到实际的游戏逻辑),但是有更一致的方法吗?

UPD: 我需要做真正的 简单之类的东西,比如数学和跳转简单的函数。也许有点收集魔法。所以我需要阻止所有除了这些东西,所以任何不安全的代码根本不存在。

0 个答案:

没有答案