我聽說一個原子表可以填滿Erlang,除非增加可創建的原子數量,否則系統將爲DDoS打開。它看起來像binary_to_existing_atom/2是解決這個問題的方法。Erlang:binary_to_atom填充原子表空間的安全問題
任何人都可以正確解釋binary_to_atom/2
是否具有安全意義,binary_to_existing_atom/2
如何解決此問題?
我聽說一個原子表可以填滿Erlang,除非增加可創建的原子數量,否則系統將爲DDoS打開。它看起來像binary_to_existing_atom/2是解決這個問題的方法。Erlang:binary_to_atom填充原子表空間的安全問題
任何人都可以正確解釋binary_to_atom/2
是否具有安全意義,binary_to_existing_atom/2
如何解決此問題?
當一個原子被第一次使用它被賦予內部號碼,並把在VM的陣列。這個數組是靜態分配的,如果使用了足夠多的不同原子,這個數組可以填滿。 binary_to_existing_atom只會將二進制字符串轉換爲數組中已經存在的原子,如果它不存在,則調用將失敗。
如果直接將輸入數據轉換到原子而不做任何完整性檢查將有可能用於外部客戶端發送< <「一」 >>和< <「B」 >>直到數組已滿在該指出虛擬機將崩潰。
另一種避免這種情況的方法是不使用binary_to_atom,而是在不同的二進制文件上匹配模式匹配並返回所需的原子。
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.這樣,如果原子的原子表中已經存在,嘗試體避免再次創造了原子。它僅在第一次調用此函數時創建。
我很肯定這是不對的。對'list_to_atom'的調用將不*創建一個新的原子,如果一個已經存在的'name'。因此這裏的'to_atom'函數不會保存任何東西。 真正的問題在於創造原子。如果有一種方法可以創建無限數量的獨特原子,那麼最終您將耗盡原子空間(它們從未被垃圾收集)。儘量避免這種情況。 –
添加到此答案:通常,如果在代碼中使用binary_to_atom,則會出現設計錯誤。一般。 –