Erlang:binary_to_atom填满了原子表空间的安全问题

ran*_*its 4 erlang

我听说原子表可以填满Erlang,除非你增加可以创建的原子数,否则系统会为DDoS打开.看起来binary_to_existing_atom/2就是解决方案.

任何人都可以确切地解释binary_to_atom/2安全含义是如何binary_to_existing_atom/2解决这个问题的?

Luk*_*kas 10

首次使用原子时,会给出一个内部编号,并将其放入VM中的数组中.该数组是静态分配的,如果使用了足够多的不同原子,则可以填满.binary_to_existing_atom只会将二进制字符串转换为数组中已存在的原子,如果它不存在,则调用将失败.

如果您将输入数据直接转换为原子而不进行任何健全性检查,外部客户端可能会发送<<"a">>和<<"b">>直到数组已满,此时vm将崩溃.

避免这种情况的另一种方法是简单地不使用binary_to_atom而是在不同的二进制文件上进行模式匹配并返回所需的原子.

  • 若要添加此答案:如果在代码中使用binary_to_atom,通常会出现设计错误.一般. (4认同)