限制使用Clojure fn

时间:2011-09-23 13:22:35

标签: security api clojure

我有一个应用程序,其中Clojure代码从应用程序类路径 远程文件存储资源进行评估。

只有管理员才能访问类路径位置,但所有用户都可以在远程存储上提供代码。为了便于某些操作,应用程序API包括一个auth/as-admin宏,如果它们作为登录管理员执行,则执行输入表单,但显然我不希望它在用户提供的代码中成功使用。

如何可靠地限制auth/as-admin使用仅类路径代码,防止用户代码中的任何“恶意”binding试图绕过约束?

2 个答案:

答案 0 :(得分:2)

在阅读代码之后,在评估代码之前,您可以迭代它并删除危险的调用,

(ns tmp
  (:require [clojure.zip :as zip])
  (:use clojure.contrib.pprint))

;;stolen from http://nakkaya.com/2011/06/29/ferret-an-experimental-clojure-compiler/
(defn remove-form [tree pred]
  (loop [loc (zip/seq-zip tree)]
    (if (zip/end? loc)
      (zip/root loc)
      (recur
       (zip/next
        (if (pred (zip/node loc))
          (zip/remove loc)
          loc))))))


(remove-form (read-string (str \( "(+ 1 1)
                                  (println \"No print\")"
                               \)))
             #(and (seq? %)
                   (= 'println (first %))))

这将删除所有println调用,

tmp=> ((+ 1 1))

或者您可以使用专为此设计的clj-sandbox等库。

答案 1 :(得分:1)

hiredman在clojure IRC频道保留了clojurebot。这个机器人是如何从不受信任的来源沙箱clojure代码的一个很好的例子。

https://github.com/hiredman/clojurebot

谢谢Hiredman! Clojurebot真棒:)