在clojure中安全地解析地图

Art*_*ldt 3 clojure

我正在寻找一种简单而安全的方法来解析地图,并且只从不受信任的来源提供的字符串中解析地图.地图包含关键字和数字.使用read这个有什么安全问题?

小智 5

read默认情况下完全不安全,它允许任意代码执行.试试(read-string "#=(println \"hello\")")这个例子吧.

您可以通过绑定*read-eval*到false 来使其更安全.如果#=使用符号,这将导致触发异常.例如:

(binding [*read-eval* false] (read-string "#=(println \"hello\")"))

最后,根据您使用它的方式,通过提供大量关键字(:foo,:bar)可能会导致拒绝服务攻击.关键字是实习的,永远不会被释放,因此如果使用的话,进程将耗尽内存.在clojure-dev列表上有一些讨论.