безопасно разбирать карты в clojure - PullRequest
3 голосов
/ 22 января 2010

Я ищу простой и безопасный способ анализа карты и только карты из строки, предоставленной ненадежным источником.Карта содержит ключевые слова и цифры.Каковы проблемы безопасности использования read для этого?

Ответы [ 2 ]

5 голосов
/ 25 января 2010

read по умолчанию абсолютно небезопасен, он позволяет выполнять произвольный код. Попробуйте (read-string "#=(println \"hello\")") в качестве примера.

Вы можете сделать это безопаснее, связав *read-eval* со значением false. Это вызовет исключение, если используется нотация #=. Например:

(binding [*read-eval* false] (read-string "#=(println \"hello\")"))

Наконец, в зависимости от того, как вы его используете, существует потенциальная атака типа «отказ в обслуживании», если указать большое количество ключевых слов (: foo,: bar). Ключевые слова интернированы и никогда не освобождаются, поэтому, если их использовать достаточно, процессу не хватит памяти. есть обсуждение об этом в списке clojure-dev.

2 голосов
/ 26 января 2010

Если вы хотите быть в безопасности, я думаю, что вам, в основном, нужно разобрать его вручную, не выполняя оценку. Вот пример одного из способов сделать это:

(apply hash-map 

   (map #(%1 %2) 

        (cycle [#(keyword (apply str (drop 1 %))) 

                #(Integer/parseInt %)]) 

        (string/split ":a 23 :b 32 :c 32" #" ")))

В зависимости от типов чисел, которые вы хотите поддерживать, и от того, сколько проверок ошибок вы хотите выполнить, вы захотите изменить две функции, которые циклически повторяются, чтобы обрабатывать каждую другую карту для каждого значения или ключевого слова. *

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