Erlang: binary_to_atom заполняет проблему безопасности табличного пространства atom - PullRequest
4 голосов
/ 23 июля 2011

Я слышал, что таблица атомов может заполняться в Эрланге, оставляя систему открытой для DDoS, если вы не увеличите число атомов, которые могут быть созданы.Похоже, что решение для этого - binary_to_existing_atom / 2.

Кто-нибудь может объяснить, как именно binary_to_atom/2 является следствием безопасности и как binary_to_existing_atom/2 решает эту проблему

Ответы [ 2 ]

10 голосов
/ 23 июля 2011

Когда атом используется впервые, ему присваивается внутренний номер и он помещается в массив в виртуальной машине. Этот массив размещается статически и может заполняться, если используется достаточно много разных атомов. binary_to_existing_atom будет преобразовывать только двоичную строку в атом, который уже существует в массиве, если он не существует, вызов завершится неудачно.

Если вы преобразуете входные данные непосредственно в атомы без каких-либо проверок работоспособности, внешний клиент мог бы отправлять << "a" >> и << "b" >> до тех пор, пока в какой момент массив не заполнится. ВМ рухнет.

Еще один способ избежать этого - просто не использовать binary_to_atom, а вместо этого сопоставлять паттерны в разных двоичных файлах и возвращать нужный атом.

0 голосов
/ 24 июля 2011

list_to_atom / 1 и binary_to_atom / 1 являются очень серьезными ошибками в коде erlang.Всегда создавайте главную функцию, подобную этой:

to_atom(X) when is_list(X) -> 
  try list_to_existing_atom(X) of
     Atom -> Atom
  catch
    _Error:_ErrorReason -> list_to_atom(X)
  end.<br>
Таким образом, если атом уже существует в таблице Atom, тело try избегает повторного создания атома.Эта функция создается только при первом вызове этой функции.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...