2011-04-09 70 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中跳轉!