За http://clojure.org/reader, существуют правила, для которых символы действительны в символах и ключевых словах. (На данный момент, буквенно-цифровые символы и *
, +
, !
, -
, _
и ?
.) Вы никогда не должны создавать символ, содержащий любые другие символы. Однако прямо сейчас эти правила полностью не соблюдаются компилятором.
В лучшем случае вы можете получить недействительные ключевые слова. В худшем случае вы можете оказаться со злыми / опасными, как
Михал Марчик сказал. Имейте в виду, что #=()
может использоваться для запуска произвольного кода во время чтения, поэтому вам даже не нужно оценивать строку на случай плохих событий, вам нужно только прочитать ее.
(keyword "foo #=(steal-passwords-and-delete-hard-drive)")
(См. (doc *read-eval*)
, чтобы узнать, как отключить это поведение, но read-eval включен по умолчанию.)
Я думаю, что общие правила для дезинфекции пользовательского ввода применяются здесь. Определите, что именно вы хотите разрешить, и запретите все остальное по умолчанию. Возможно, разрешите что-то вроде регулярного выражения #"[a-zA-Z0-9*+!-_?]+"
, возможно, с другими буквенно-цифровыми цифрами в зависимости от языка, на котором вы говорите.