2011-04-09 69 views
0

我想让clj-sandbox允许defdefnClj-Sandbox的bug?

我没有得到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. 

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

回答

2

clj-sandbox是一个错误的混乱。有一些设计决定,从长远来看,最终是不好的想法。

Alan Malloy和我写了一个名为clojail的新沙箱库,以替换我们自己项目中的clj-sandbox。我不确定有任何项目在生产中仍然使用clj-sandbox,并且不再维护它。

不幸的是,clojail没有支持def/defn的clj-sandbox。意思是说,你可以允许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中跳转!