转换外部字符串原子

问题描述 投票:1回答:1

在页码。 25在“编程菲尼克斯1.4(电子书,测试版)”,有撤销由克里斯·麦考德,上面写着:

在我们的控制器的全球行动,外部参数有串钥匙,“名” =>名称,而在内部,我们使用的名称:名称。这是一个惯例,接着整个凤凰。外部数据不能安全地转换成原子,因为原子表不是垃圾收集。相反,我们明确匹配的字符串键,然后我们的应用程序边界像控制器和渠道将它们转换成原子键,我们将依靠其他地方里面凤凰。

复述,该帖称:

外部数据不能安全地转换成原子...所以你字符串转换键原子键...

咦?我想他是想说的是,如果有人向你一些JSON数据为100亿美元(串)键,你一味整个JSON转换成灵药地图与原子键,那么你将在溢出原子的危险表。在另一方面,如果你使用模式匹配挑出来的键/值,你有兴趣从JSON数据,然后将它们插入到仙丹地图与原子键,那么你显然会创造在原子表更少的原子。

elixir phoenix-framework
1个回答
1
投票

那是对的。所述垃圾收集器安全地处置,这不是正在使用的任何过程中的所有数据,除了原子。这是因为一旦创建原子他们永久地保存在二郎原子表(其中有一个固定的限制)。

Erlang manual

原子没有垃圾收集。一旦原子被创建,它永远不会被删除。如果达到(1048576默认情况下)的原子数的限制仿真器终止。

这意味着如果你使用类似外部数据String.to_atom/1(从插座或在Web请求接收例如输入),恶意用户(甚至有规律之一,在不知不觉中)可能DoS攻击你的符号表,崩溃您的应用程序。如果由于某种原因,你需要一个外部字符串转换为原子,你应该使用String.to_existing_atom/1这就保证了原子是前手的确创造。


其他资源:


在一个侧面说明,我居然创造了package因为这个原因 - 我想安全地使用在凤凰Web请求用户输入原子。

© www.soinside.com 2019 - 2024. All rights reserved.