Clojure 防止执行未经授权的代码

Clojure 防止执行未经授权的代码,clojure,Clojure,我目前正在编写一个应用程序,它接受一系列Clojure表单,当对这些表单进行评估时,结果将返回到一个列表中 例如,输入是 (data "abc" :identifier) (data "gee" :identifier) (content "def" :identifier [1 2 3 4 5]) 后端中的函数基本上只是将它们转换为Clojure映射,例如 (defn data [text id] {:text text :id id}) (defn content [text id

我目前正在编写一个应用程序,它接受一系列Clojure表单,当对这些表单进行评估时,结果将返回到一个列表中

例如,输入是

(data "abc" :identifier)
(data "gee" :identifier)
(content "def" :identifier [1 2 3 4 5])
后端中的函数基本上只是将它们转换为Clojure映射,例如

(defn data [text id]
    {:text text :id id})
(defn content [text id cont]
    {:text text :id id :cont cont})
问题是,我目前处理代码的方式是通过
(->input read string eval)
接受输入并相应地获取内容。这是不好的,因为任何人都可以在输入中添加狡猾的
(系统/出口1)
,然后关闭JVM

是否有任何方法可以“白名单”的Clojure形式,可以在这一步中执行,并黑名单所有讨厌的东西?还是我太天真了,没有使用Clojure表单作为数据输入机制

退房吧,太棒了


你可以在irc.freenode.net上的#clojure上与它进行交互,如果你愿意的话,可以尝试突破它:)通过手柄lazybot。它也用于

如果您只有一个固定的允许函数白名单,您可以在这里轻松地滚动自己的函数。只要有一个像
{'data,'content content}
这样的映射,将符号映射到允许的函数,然后在映射中查找其形式的第一个元素(即函数调用)。如果它在那里,它会直接映射到您想要调用的函数,您可以将它的其余形式作为参数传递。

请确保将read eval绑定为false,以防止使用read eval宏
#(System/exit1)
啊,这就是我需要的,谢谢提示!我还使用了
clojail/safe read
函数来读取表单,这是一个重要的步骤(任何一种解决方案都可以),很多人都忘记了这一点,甚至包括我,而我是将
safe read
添加到clojail的人!我的天哪!可能有这样的机制,但你们需要在便利性和潜在风险之间进行权衡。酷,只是在研究这个。我选择了amalloy的解决方案,因为它更适合我的需要,但我也在使用Clojail中的
安全读取
功能。