从理论上讲,可以通过在内存中创建太多原子来关闭Phoenix / Elixir应用程序。由于原子没有被垃圾回收,因此可能导致内存溢出。我可以想象,攻击者可能会使用用户输入(例如通过表单/ REST API)创建任意数量的原子,原子数量足以使应用程序崩溃。
当然,凤凰城似乎已经做得相当不错。因此,如果我将其发布到测试应用程序:
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"}
我还需要采取更多预防措施来防止此类攻击吗?
最佳答案
参数中的键是字符串而不是原子的原因是为了避免基于用户输入创建原子。
您可以在带毒HTTP头的解码功能中找到相同的内容。
无需采取任何预防措施,键的用户输入始终被视为字符串,而不是原子。如果发现不是这种情况,那么几乎可以肯定是一个错误。
如果确实需要动态创建原子,则应使用String.to_existing_atom/1而不是String.to_atom/1。
关于security - Phoenix应用程序中可能的DoS/是否有必要进一步清理用户输入?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33956319/