Смертные и бессмертные символы в Ruby
Символы теперь собираются мусором .. или нет
В этой статье мы собираемся изучить следующие темы:
- символы уникальны
- символы начиная с Ruby 2.2
- использование бреши в системе безопасности с помощью символов
Прежде, чем начать
Позвольте мне представить здесь платформу, которая помогла мне изучить большую часть моих знаний о Ruby. Действительно, Pluralsight - потрясающая платформа.
С 50+ курсами, которые охватывают различные темы по Ruby и Ruby on Rails, это лучший способ поднять свои знания на новый уровень!
Попробуйте бесплатно 👇😉
Спасибо за уделенное время!
Символы уникальны
Символ - это уникальный экземпляр класса Symbol
, который обычно используется для идентификации определенного ресурса. Ресурс может быть методом, переменной, хеш-ключом, состоянием и т. Д.
Символ уникален, потому что только один экземпляр класса Symbol
может быть создан для определенного символа в запущенной программе.
Здесь мы видим, что символ :pending
создается только один раз, поскольку два вызова :pending.object_id
возвращают один и тот же идентификатор объекта. Символы часто сравнивают со строками. Но основное различие между ними заключается в том, что для каждой созданной строки создается новый String
объект, даже если они идентичны.
Теперь, когда мы более знакомы с символами, давайте посмотрим на изменения, внесенные в Ruby 2.2.
Символ начиная с Ruby 2.2
В Ruby 2.2 появилось понятие символов смертных / бессмертных. Давайте посмотрим на различия между этими двумя концепциями.
Бессмертный символ
Бессмертные символы - это символы, которые никогда не будут собираться мусором. Они создаются при динамическом изменении вашего кода. Например:
- определение нового метода с помощью
define_method
- установка переменной экземпляра с помощью
set_instance_variable
- создание константы или переменной с использованием
const_set
Смертельный символ
Mortal symbol, с другой стороны, подходят для сборки мусора. Они созданы в любых других случаях. Например:
- используя
to_sym
- использование символьных литералов
- так далее..
Хорошо, теперь, когда мы более знакомы с этими двумя концепциями, давайте посмотрим, как бессмертные символы могут создавать проблемы с безопасностью.
Нарушение безопасности с использованием бессмертных символов
Возможно, не стоит создавать бессмертные символы на основе пользовательского ввода. Действительно, это позволит злоумышленнику организовать DoS-атаку против вашего приложения, заполнив его уникальными строками, что приведет к неограниченному увеличению памяти до тех пор, пока процесс Ruby не будет остановлен.
В самом деле, поскольку бессмертные символы не собираются сборщиком мусора, создание их огромного количества может заставить ваш Ruby-процесс замедляться ... или быть убитым.
Заключение
Понятие смертного символа было введено в Ruby 2.2 для оптимизации использования памяти программами Ruby. С другой стороны, бессмертные символы могут создавать проблемы с безопасностью, и вы должны использовать их в полностью безопасной среде. Избегайте их использования при взаимодействии с пользователем.
Спасибо, что нашли время прочитать эту статью.
Вуаля!