2013-04-09 78 views
3

我想發送一個字符串中的clojure表達式,以便在接收器處進行評估,這可能是一個用compojure編寫的web服務。例如,假設我有字符串「(* 7 6)」,我想把它變成'(* 7 6),然後我可以傳遞給eval並獲得42.這個操作在JavaScript中是微不足道的,但是不太確定如何在clojure中做到這一點。提示?如何將字符串轉換爲clojure表達式?

+2

當心,這將允許Web客戶端(在互聯網上的任何人)在Web服務器上執行任意代碼過程,如重新定義增值稅,脫殼,刪除文件等。 – Chouser 2013-04-09 06:11:28

+0

明白了。在允許此操作之前,我的應用程序將驗證並授權發件人完全信任。或者,它將解析,分析和/或沙箱化注入的代碼。 – 2013-04-09 12:10:02

回答

5

這應該做的伎倆:

(eval (read-string "(* 7 6)")) ;; 42 

或者,簡稱:

(load-string "(* 7 6)") ;; 42 
+2

我覺得這個應該在這裏提到;請注意,即使您不調用eval,read-string本身也會評估代碼: ''(read-string「#=(clojure.java.shell/sh \」ls \「)」)'' – bmaddy 2013-04-09 15:54:43

+0

我沒有找到#=閱讀器語法的文檔。請你好好解釋一下嗎?這是一個非常重要的觀察! – 2013-04-09 16:39:38

+0

我在下面的SW問題中找到了答案http://stackoverflow.com/questions/6427967/clojure-reader-macro。這是相當大的一筆交易,因爲如果不寫我自己的讀者就不可能阻止評估,並且可能會毀掉我的計劃來使用clojure進行安全注入。 – 2013-04-09 16:46:51

相關問題