2012-03-02 129 views
4

执行我目前正在写一个接受一系列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表单作为数据输入机制?

+0

神圣鲍比桌子!可能有这样的机制,但你需要权衡他们的潜在风险。 – user100464 2012-03-03 01:57:26

回答

4

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

+0

请确保你绑定* read-eval *为false以防止使用read-eval宏'#(System/exit1)' – 2012-03-03 00:40:46

+0

这是我需要的,谢谢你的提示!我还利用'''clojail/safe-read'''函数来读取表格 – djhworld 2012-03-03 13:18:18

+1

这是一个重要的步骤(解决方案很好),而且很多人都忘记了 - 即使是我,我也是一个人给clojail加了'safe-read'! – amalloy 2012-03-05 08:08:15

6

检出Clojail及其优秀video from the 2011 Clojure Conj

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

+0

酷,只是一直在考虑这一点。我已经使用了amalloy的解决方案,因为它更适合我所需要的,但我也在Clojail中使用了''''safe-read'''函数。 – djhworld 2012-03-03 13:19:11