2015-11-27 22 views
2

理论上可以通过在记忆中创建太多原子来取消Phoenix/Elixir应用程序。由于原子不是垃圾收集,这可能会导致内存溢出。我可以想象,攻击者可能会使用用户输入(例如通过表单/ REST API)来创建任意数量的原子,足以导致应用程序崩溃。Phoenix应用程序中可能的DoS是否需要进一步消毒用户输入?

当然凤凰似乎已经做得相当不错了。所以,如果我张贴这一个测试应用程序:

POST /api/ddos HTTP/1.1 
Host: localhost:4000 
Cache-Control: no-cache 
Content-Type: application/x-www-form-urlencoded 

key=value 

并处理它与一个简单的控制器:

def ddos(conn, params) do 
    IO.puts(inspect(params)) 
    conn 
    |> put_status(200) 
    |> json params 
end 

在IEX结果是

%{"key" => "value"} 

是否有其他注意事项我必须采取措施来防止这种攻击?

回答

8

params中的键是字符串而不是原子的原因是避免基于用户输入创建原子。

你可以在poison,HTTP headers的解码函数中找到相同的结果。

没有必要采取预防措施,用户对按键的输入始终被视为字符串而不是原子。如果你发现情况并非如此,那么它几乎肯定是一个错误。

如果您确实需要动态创建原子,那么您应该使用String.to_existing_atom/1而不是String.to_atom/1