防止执行未经授权的代码

时间:2012-03-02 23:13:07

标签: clojure

我目前正在编写一个接受一系列Clojure表单的应用程序,当它们被评估时,结果会在列表中返回

所以例如输入是

(data "abc" :identifier)
(data "gee" :identifier)
(content "def" :identifier [1 2 3 4 5])

后端的功能基本上只是将这些功能转换为Clojure地图,例如

(defn data [text id]
    {:text text :id id})
(defn content [text id cont]
    {:text text :id id :cont cont})

麻烦的是,我目前处理代码的方式是接受(-> input read-string eval)的输入并相应地获取内容。这很糟糕,因为任何人都可以在输入中附加一个狡猾的(System/exit 1)并关闭JVM

是否有任何方法可以将Clojure表格“列入白名单”,可以在此步骤中执行并将所有令人讨厌的内容列入黑名单?或者我太天真地使用Clojure表单作为数据输入机制?

2 个答案:

答案 0 :(得分:6)

查看Clojail及其出色的video from the 2011 Clojure Conj

你可以在irc.freenode.net上的#clojure上与它进行互动,并尝试突破它,如果你想:)通过句柄lazybot。它也用在4clojure.org

答案 1 :(得分:4)

如果您只有固定的允许功能白名单,您可以在这里轻松自己滚动。只需要一个像{'data data, 'content content}这样的地图,将符号映射到允许的函数,并在地图中查找其形式的第一个元素(这是一个函数调用)。如果它在那里,它会直接映射到你想要调用的函数,你可以将其余的表单作为参数传递给它。