Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.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
Binding 删除/白名单Clojure中的所有绑定_Binding_Clojure_Eval - Fatal编程技术网

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

Binding 删除/白名单Clojure中的所有绑定,binding,clojure,eval,Binding,Clojure,Eval,在我的小游戏项目中,我希望玩家在游戏中操作一些游戏中的东西,在游戏中编写一些Clojure脚本。因此,我下载了Clojure库并使用了以下代码: private val eval=Clojure.`var`(“Clojure.core”、“eval”) 乐趣评估(代码:字符串):有吗= 试一试{ eval.invoke(Clojure.read(“(do$code)”)) }捕获(e:例外){ e、 printStackTrace() 无效的 } 但问题是,通过这样做,玩家可以操纵整个程序,因

在我的小游戏项目中,我希望玩家在游戏中操作一些游戏中的东西,在游戏中编写一些Clojure脚本。因此,我下载了Clojure库并使用了以下代码:

private val eval=Clojure.`var`(“Clojure.core”、“eval”)
乐趣评估(代码:字符串):有吗=
试一试{
eval.invoke(Clojure.read(“(do$code)”))
}捕获(e:例外){
e、 printStackTrace()
无效的
}
但问题是,通过这样做,玩家可以操纵整个程序,因为它运行在与游戏代码相同的环境中。最简单的例子是
(系统/出口0)

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

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

upd:
我需要做一些非常简单的事情,比如数学和简单的函数。也许有点收藏的魔力。因此,我需要阻止除此之外的所有内容,这样任何不安全的代码都不可能存在。

这种技术被称为
沙盒,通过谷歌搜索“clojure sandbox”,我终于找到了关于这个主题的文章

UPD: 我需要的是白名单,而不是黑名单,因为它是在互联网上使用的。 花了一整天的时间,但终于让它正常工作了

private val eval=Clojure.`var`(“Clojure.core”、“eval”)
val whitelist=listOf(“+”、“-”、“*”、“/”、“=”)//示例
初始化{
val wh=whitelist.joinToString(“,”[“,”]){“\“$it\”}
评估
(让[wh(vec(地图符号$wh))]
(doseq[n(所有n个):让[n(n个名称n)]]
(如果(=(str n)“clojure.core”)
(doseq[[k](ns map n):何时(不是(某些(fn[x](=xk))wh))]
(ns unmap n k)
(删除ns n)))
""")
}
乐趣评估(代码:字符串):有吗=
试一试{
eval.invoke(Clojure.read(“(do$code)”))
}捕获(e:例外){
e、 printStackTrace()
无效的
}

如何使用cljs而不是clj,并通过嵌入式js eval(如rhino)运行播放器代码?这可能会比Sandbox简单得多哦,这是谷歌搜索这类东西的合适词<代码>沙箱
!非常感谢,终于找到了很多关于它的文章