Ограничить использование Clojure fn - PullRequest
3 голосов
/ 23 сентября 2011

У меня есть приложение, в котором код Clojure оценивается либо из пути к классу приложения , либо как ресурс удаленного хранилища файлов .

Только администратор имеет доступ к расположению пути к классам, но все пользователи могут предоставить свой код в удаленном хранилище. Чтобы упростить некоторые операции, API приложения включает макрос auth/as-admin, который выполняет формы ввода, если они были выполнены как зарегистрированный администратор, но, очевидно, я не хочу, чтобы он успешно использовался в предоставленном пользователем коде.

Как я могу надежно ограничить использование auth/as-admin кодом только для classpath, предотвращая любые «злонамеренные» binding в коде пользователя, пытающиеся обойти ограничение?

Ответы [ 2 ]

2 голосов
/ 23 сентября 2011

После прочтения кода и перед его оценкой вы можете выполнить итерацию и удалить опасные вызовы,

(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 голос
/ 23 сентября 2011

наемный работник поддерживает clojurebot на IRC-канале clojure. Этот бот является отличным примером того, как «замочить» код clojure из ненадежных источников.

https://github.com/hiredman/clojurebot

Спасибо Hiredman! Clojurebot это круто :) 1006 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...