2012-03-02 129 views
4

執行我目前正在寫一個接受一系列Clojure的形式和他們進行評估時,結果得到的列表防止未經授權的代碼

返回因此,例如輸入將是一個應用程序

(data "abc" :identifier) 
(data "gee" :identifier) 
(content "def" :identifier [1 2 3 4 5]) 

後端的功能基本上只是把它們變成Clojure地圖,例如

(defn data [text id] 
    {:text text :id id}) 
(defn content [text id cont] 
    {:text text :id id :cont cont}) 

麻煩的是,我在處理此刻的代碼的方式是通過接受輸入與(-> input read-string eval),並相應地獲得內容。這是不好的,因爲任何人都可以將狡猾的(System/exit 1)附加到輸入並關閉JVM

有什麼方法可以將可以在此步驟中執行的Clojure表單「列入白名單」並將所有討厭的內容列入黑名單?或者我太過於天真地使用Clojure表單作爲數據輸入機制?

+0

神聖鮑比桌子!可能有這樣的機制,但你需要權衡他們的潛在風險。 – user100464 2012-03-03 01:57:26

回答

4

如果您只有固定的允許功能白名單,您可以輕鬆地在此處推出自己的白名單。只需要像{'data data, 'content content}這樣的地圖,將符號映射到允許的函數,然後在地圖中查找其形式的第一個元素(這是一個函數調用)。如果它在那裏,它會直接映射到您想要調用的函數,並且可以將其餘的表單作爲參數傳遞給它。

+0

請確保你綁定* read-eval *爲false以防止使用read-eval宏'#(System/exit1)' – 2012-03-03 00:40:46

+0

這是我需要的,謝謝你的提示!我還利用'''clojail/safe-read'''函數來讀取表格 – djhworld 2012-03-03 13:18:18

+1

這是一個重要的步驟(解決方案很好),而且很多人都忘記了 - 即使是我,我也是一個人給clojail加了'safe-read'! – amalloy 2012-03-05 08:08:15

6

檢出Clojail及其優秀video from the 2011 Clojure Conj

你可以在irc.freenode.net上的#clojure上與它進行交互,並嘗試突破它,如果你想:)通過處理lazybot。它也用於4clojure.org

+0

酷,只是一直在考慮這一點。我已經使用了amalloy的解決方案,因爲它更適合我所需要的,但我也在Clojail中使用了''''safe-read'''函數。 – djhworld 2012-03-03 13:19:11