我听说原子表可以填满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而是在不同的二进制文件上进行模式匹配并返回所需的原子.