2011-09-23 20 views
3

我有其中的Clojure代碼被從應用程序類路徑或作爲遠程文件存儲資源評價任一的應用程序。限制使用一個的Clojure的FN

只有管理員可以訪問類路徑位置,但所有用戶都可以在遠程存儲上提供他們的代碼。爲了便於執行某些操作,應用程序API包含一個auth/as-admin宏,如果它們是以登錄管理員身份執行的,則會執行輸入表單,但顯然我不希望它成功用於用戶提供的代碼。

我怎樣才能可靠地限制使用auth/as-admin類路徑,唯一的代碼,防止用戶代碼中的任何「惡意」 binding試圖繞過約束?

回答

2

閱讀的代碼,並評估它之前,你可以遍歷並刪除危險的來電後,

(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。

+0

使用策略的沙盒會對整個JVM施加限制,對吧?我仍然需要授予'auth/as-admin'對可信系統代碼的訪問權限,我不知道我是否真的可以這樣做。我會給你一個建議。 – skuro

+0

我不知道如何閱讀或接收要執行的代碼,但只需通過篩選器運行不受信任的代碼,但這不會影響JVM上的任何內容,只會傳遞給它的sexpressions。 –

+0

是的,我明白了,我只是在評論'clj-sandbox'的建議,因爲它確實需要使用JVM的全局設置(策略文件) – skuro

1

hiredman在clojure IRC頻道上維護clojurebot。這個機器人是一個很好的例子,說明如何從不受信任的來源獲取clojure代碼。

https://github.com/hiredman/clojurebot

感謝Hiredman! Clojurebot it awesome :)