我想让clj-sandbox允许def
和defn
。
我在def
工作时没有遇到任何问题:
(use 'net.licenser.sandbox
'net.licenser.sandbox.tester
'net.licenser.sandbox.matcher)
(def my-tester
(extend-tester secure-tester (whitelist (function-matcher 'def))))
(def my-sandbox
(stringify-sandbox (new-sandbox :tester my-tester)))
(my-sandbox
"(def a (clojure.core/fn a ([b] (inc b))))")
(println (my-sandbox "(a 5)"))
然而,defn
给了我一些问题。看起来我的代码传递了沙箱指南,但在执行期间失败了:
; (macroexpand '(defn y [z] (inc z)))
(my-sandbox
"(def y (.withMeta (clojure.core/fn y ([z] (inc z))) (.meta (var y))))")
; java.lang.SecurityException: Exception in sandboxed code.
这是一个错误,还是我做错了什么?
答案 0 :(得分:2)
clj-sandbox有点乱。从长远来看,做出了一些设计决策,最终成为糟糕的想法。
Alan Malloy和我编写了一个名为clojail的新沙箱库来替换我们自己项目中的clj-sandbox。我不确定是否有任何项目仍在生产中使用clj-sandbox,并且不再维护。
不幸的是,clojail不支持clj-sandbox所拥有的def / defn。意思是,你可以允许def / defn,但它们根本不会被沙盒化。它们可用于强制出现内存错误。 http://try-clojure.org没有那个问题,因为它必须拥有它自己的小def / defn沙箱(它存储在cookie中)。如果您需要这种行为,您应该能够主要从try-clojure's version复制/粘贴。
无论如何,我实际上忘记了def / defn在clj-sandbox中的行为,这可能就是为什么我们还没有将它添加到clojail中。我稍后会提出问题,并尽快实施。
无论如何,clojail是我现在所知道的唯一一个积极维护的沙盒库。它用于sexpbot和try-clojure,我们在Freenode上有一个频道和其他与sexpbot相关的项目。如果您需要任何帮助,请跳至#sexpbot!