Clj-Sandbox bug?

时间:2011-04-09 17:44:00

标签: clojure sandbox

我想让clj-sandbox允许defdefn

我在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.

这是一个错误,还是我做错了什么?

1 个答案:

答案 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!

相关问题