如何将字符串转换为Clojure表达式?

3

我想发送一个包含Clojure表达式的字符串,以便在接收端进行评估,该接收端可能是使用Compojure编写的Web服务。例如,假设我有字符串“(* 7 6)”,我希望将其转换为'(* 7 6),然后将其传递给eval并获得42。这个操作在JavaScript中很简单,但不太确定如何在Clojure中实现。有什么提示吗?


2
请注意,这将允许Web客户端(互联网上的任何人)在您的Web服务器进程中执行任意代码,例如重新定义变量,外壳,删除文件等。 - Chouser
明白了。我的应用程序将在允许此操作之前对发送者进行身份验证和授权以获得完全信任。或者,它将解析、分析和/或沙盒注入的代码。 - Reb.Cabin
1个回答

5
这应该可以解决问题:
(eval (read-string "(* 7 6)")) ;; 42

或者简单说:
(load-string "(* 7 6)") ;; 42

2
我觉得这里应该提一下,即使你不调用eval,read-string本身也会评估代码: (read-string "#=(clojure.java.shell/sh \"ls\")") - bmaddy
我没有找到#=阅读器语法的文档。您能否请好心解释一下呢?这是一个非常重要的观察! - Reb.Cabin
我在以下 SW 问题中找到了答案:https://dev59.com/s2w15IYBdhLWcg3wv-NM。这是一个相当大的问题,因为它使得无法通过编写自己的 reader 来防止评估,并可能破坏我使用 clojure 进行安全注入的计划。 - Reb.Cabin
在这里找到了如何关闭它的方法:https://groups.google.com/forum/?fromgroups=#!topic/clojure/_QBcSXE2iuE - Reb.Cabin
1
好的,我很高兴提到这个。当您实际执行代码时,您可能还想使用clojail - bmaddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接