在我的小游戏项目中,我希望玩家能够在游戏中操纵一些游戏内容来编写一些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: 我需要做真正的 简单之类的东西,比如数学和跳转简单的函数。也许有点收集魔法。所以我需要阻止所有除了这些东西,所以任何不安全的代码根本不存在。