閱讀的代碼,並評估它之前,你可以遍歷並刪除危險的來電後,
(ns tmp
(:require [clojure.zip :as zip])
(:use clojure.contrib.pprint))
;;stolen from http://nakkaya.com/2011/06/29/ferret-an-experimental-clojure-compiler/
(defn remove-form [tree pred]
(loop [loc (zip/seq-zip tree)]
(if (zip/end? loc)
(zip/root loc)
(recur
(zip/next
(if (pred (zip/node loc))
(zip/remove loc)
loc))))))
(remove-form (read-string (str \("(+ 1 1)
(println \"No print\")"
\)))
#(and (seq? %)
(= 'println (first %))))
這將刪除所有的println電話,
tmp=> ((+ 1 1))
,或者您可以使用庫等作爲爲此設計的clj-sandbox。
使用策略的沙盒會對整個JVM施加限制,對吧?我仍然需要授予'auth/as-admin'對可信系統代碼的訪問權限,我不知道我是否真的可以這樣做。我會給你一個建議。 – skuro
我不知道如何閱讀或接收要執行的代碼,但只需通過篩選器運行不受信任的代碼,但這不會影響JVM上的任何內容,只會傳遞給它的sexpressions。 –
是的,我明白了,我只是在評論'clj-sandbox'的建議,因爲它確實需要使用JVM的全局設置(策略文件) – skuro