小智
5
read默认情况下完全不安全,它允许任意代码执行.试试(read-string "#=(println \"hello\")")这个例子吧.
您可以通过绑定*read-eval*到false 来使其更安全.如果#=使用符号,这将导致触发异常.例如:
(binding [*read-eval* false] (read-string "#=(println \"hello\")"))
最后,根据您使用它的方式,通过提供大量关键字(:foo,:bar)可能会导致拒绝服务攻击.关键字是实习的,永远不会被释放,因此如果使用的话,进程将耗尽内存.在clojure-dev列表上有一些讨论.