3

我正在尝试利用返回纯 json 的 postgres 功能,因此我在我的 Ecto 模型中添加了一个方法,该方法执行查询,返回所需的 json。

defmodule BoardApi.Board do
  use Ecto.Model

  def json_by_id(id) do
    sql = "SELECT row_to_json(json) AS result FROM (SELECT array_agg(users) AS users FROM users WHERE id=#{id}) json;"
    result = Ecto.Adapters.SQL.query(BoardApi.Repo, sql, [])

    return List.first(result.rows) |> Tuple.to_list |> List.first
  end

我的问题是,这是否具有 sql 注入潜力,是否可以使用准备好的语句之类的东西?

4

1 回答 1

4

您正在寻找. Ecto.Adapters.SQL.query/4SQL 语句可以有数字变量,例如$1, $2, ...,然后使用函数调用的第三个参数将这些参数传递到列表中。

您可以通过以下方式实现您想要的:

defmodule BoardApi.Board do
  use Ecto.Model

  def json_by_id(id) do
    sql = "SELECT row_to_json(json) AS result FROM (SELECT array_agg(users) AS users FROM users WHERE id=$1) json;"
    result = Ecto.Adapters.SQL.query(BoardApi.Repo, sql, [id])

    # `return` is not valid Elixir
    result.rows |> hd |> elem(0)
  end
end
于 2015-02-17T17:16:37.470 回答