Смертные и бессмертные символы в 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. С другой стороны, бессмертные символы могут создавать проблемы с безопасностью, и вы должны использовать их в полностью безопасной среде. Избегайте их использования при взаимодействии с пользователем.

Спасибо, что нашли время прочитать эту статью.

Вуаля!