read
по умолчанию абсолютно небезопасен, он позволяет выполнять произвольный код. Попробуйте (read-string "#=(println \"hello\")")
в качестве примера.
Вы можете сделать это безопаснее, связав *read-eval*
со значением false. Это вызовет исключение, если используется нотация #=
. Например:
(binding [*read-eval* false] (read-string "#=(println \"hello\")"))
Наконец, в зависимости от того, как вы его используете, существует потенциальная атака типа «отказ в обслуживании», если указать большое количество ключевых слов (: foo,: bar). Ключевые слова интернированы и никогда не освобождаются, поэтому, если их использовать достаточно, процессу не хватит памяти. есть обсуждение об этом в списке clojure-dev.