2013-04-09 80 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

相关问题