Последствия для безопасности создания ключевого слова Clojure из пользовательских данных? - PullRequest
8 голосов
/ 20 мая 2010

Предположим, что я использую предоставленную пользователем строку, строку пользователя и вызов (ключевое слово userstring).

Есть ли какие-либо проблемы безопасности в связи с этим? И если да, то как лучше всего их смягчить?

Ответы [ 2 ]

7 голосов
/ 21 мая 2010

За http://clojure.org/reader, существуют правила, для которых символы действительны в символах и ключевых словах. (На данный момент, буквенно-цифровые символы и *, +, !, -, _ и ?.) Вы никогда не должны создавать символ, содержащий любые другие символы. Однако прямо сейчас эти правила полностью не соблюдаются компилятором.

В лучшем случае вы можете получить недействительные ключевые слова. В худшем случае вы можете оказаться со злыми / опасными, как Михал Марчик сказал. Имейте в виду, что #=() может использоваться для запуска произвольного кода во время чтения, поэтому вам даже не нужно оценивать строку на случай плохих событий, вам нужно только прочитать ее.

(keyword "foo #=(steal-passwords-and-delete-hard-drive)")

(См. (doc *read-eval*), чтобы узнать, как отключить это поведение, но read-eval включен по умолчанию.)

Я думаю, что общие правила для дезинфекции пользовательского ввода применяются здесь. Определите, что именно вы хотите разрешить, и запретите все остальное по умолчанию. Возможно, разрешите что-то вроде регулярного выражения #"[a-zA-Z0-9*+!-_?]+", возможно, с другими буквенно-цифровыми цифрами в зависимости от языка, на котором вы говорите.

6 голосов
/ 20 мая 2010

с макушки головы:

(keyword s) создаст ключевое слово без пространства имен с именем s независимо от того, может ли такое ключевое слово быть представлено литералом ключевого слова. Это может быть проблемой безопасности, если вы распечатаете эти ключевые слова как часть некоторого файла конфигурации, скажем, а затем попытаетесь использовать его в качестве доверенного кода:

(with-out-str (println (keyword "foo (println :bar)")))
; => :foo (println :bar)

Кроме того, здесь представлены две темы, представляющие интерес для групп Google (первая из которых принадлежит clojure-dev):

  1. Запрос на улучшение (с патчем): поиск не интернирующих ключевых слов

  2. Собирают ли ключевые слова и символы мусор?

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

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