2013-04-09 5 views
3

Я хотел бы отправить выражение clojure в строку, которая будет оцениваться в приемнике, которая может быть веб-службой, написанной на compojure. Например, предположим, что у меня есть строка «(* 7 6)», которую я хотел бы включить в (* 7 6), которую я могу передать в eval и получить 42. Эта операция тривиальна в JavaScript, но не совсем уверен, как это сделать в clojure. Советы?как преобразовать строку в выражение clojure?

+2

Берегись, это позволит веб-клиент (любой в Интернете), чтобы выполнить произвольный код на вашем веб-сервере процесс, такой как переопределение варов, обстрел, удаление файлов и т. д. – Chouser

+0

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

ответ

5

Это должно сделать трюк:

(eval (read-string "(* 7 6)")) ;; 42 

Или, короче:

(load-string "(* 7 6)") ;; 42 
+2

Я чувствую, что это следует упомянуть здесь; будьте осторожны, даже если вы не вызываете eval, сама строка чтения будет оценивать код: '' '(read-string" # = (clojure.java.shell/sh \ "ls \") ")' '' – bmaddy

+0

Я не нашел документацию для синтаксиса # = читателя. Не могли бы вы объяснить, пожалуйста? Это очень важное замечание! –

+0

Я нашел ответ в следующем вопросе SW http://stackoverflow.com/questions/6427967/clojure-reader-macro. Это довольно большая проблема, поскольку это делает невозможным предотвращение оценки без написания моего собственного читателя и может испортить мои планы использования clojure для безопасной инъекции. –

Смежные вопросы