Предотвращение выполнения неавторизованного кода - PullRequest
4 голосов
/ 03 марта 2012

В настоящее время я пишу приложение, которое принимает серию форм 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 ]

6 голосов
/ 03 марта 2012

проверить Clojail и его отличное видео с Clojure Conj 2011 года !

, вы можете взаимодействовать с ним на #clojure на irc.freenode.net и попробоватьпрорваться через него, если хотите :) идет за ручку лентяйка.он также используется на 4clojure.org

4 голосов
/ 03 марта 2012

Если у вас есть только фиксированный белый список допустимых функций, вы можете легко свернуть свой собственный здесь. Просто имейте карту типа {'data data, 'content content}, отображающую символы в разрешенные функции, и ищите первый элемент их формы (который является вызовом функции) на карте. Если он есть, он отображается прямо на функцию, которую вы хотите вызвать, и вы можете передать ей остальную часть их формы в качестве аргументов.

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