Phoenix app中可能的DoS /是否有必要进一步消毒用户输入?

Ole*_*ann 2 security elixir phoenix-framework

从理论上讲,可以通过在内存中创建太多原子来取消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
Run Code Online (Sandbox Code Playgroud)

并使用简单的控制器处理它:

def ddos(conn, params) do
    IO.puts(inspect(params))
    conn
    |> put_status(200)
    |> json  params
end
Run Code Online (Sandbox Code Playgroud)

iex的结果是

%{"key" => "value"}
Run Code Online (Sandbox Code Playgroud)

我是否需要采取更多预防措施来防止此类攻击?

Gaz*_*ler 8

params中的键是字符串而不是原子的原因是为了避免根据用户输入创建原子.

您将在毒药,HTTP标头的解码功能中找到相同的内容.

您不必采取任何预防措施,键的用户输入始终被视为字符串而不是原子.如果您发现情况并非如此,则几乎可以肯定是一个错误.

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