2010-01-22 32 views
3

我正在寻找一种简单而安全的方式来解析一个地图,并从一个不受信任的源提供的字符串中只有一个地图。地图包含关键字和数字。使用read来做这件事有什么安全隐患?安全地解析clojure的地图

回答

5

read默认情况下完全不安全,它允许任意代码执行。以(read-string "#=(println \"hello\")")为例。

您可以通过将*read-eval*设置为false来使其更安全。如果使用#=表示法,这将导致异常被触发。例如:

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

最后,这取决于你如何使用它有通过提供大量的关键字服务攻击的潜在的拒绝(:FOO,:巴)。关键字被拦截,永远不会被释放,所以如果使用了足够的内存,进程将会耗尽内存。在clojure-dev列表上有关于这个的some discussion

2

如果你想要安全,我认为你基本上需要手动解析它,而不进行评估。这里是一种方式的例子来做到这一点:

(apply hash-map 

    (map #(%1 %2) 

     (cycle [#(keyword (apply str (drop 1 %))) 

       #(Integer/parseInt %)]) 

     (string/split ":a 23 :b 32 :c 32" #" "))) 

根据类型的数字要支持,你要多少错误检查,你会希望修改正在循环在两个功能将每个地图的每个其他值处理为关键字或数字。