我有一个应用程序,其中Clojure代码从应用程序类路径 或远程文件存储资源进行评估。
只有管理员才能访问类路径位置,但所有用户都可以在远程存储上提供代码。为了便于某些操作,应用程序API包括一个auth/as-admin
宏,如果它们作为登录管理员执行,则执行输入表单,但显然我不希望它在用户提供的代码中成功使用。
如何可靠地限制auth/as-admin
使用仅类路径代码,防止用户代码中的任何“恶意”binding
试图绕过约束?
答案 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真棒:)