【问题标题】:Prepared statements with Postgrex & Ecto使用 Postgrex 和 Ecto 准备好的语句
【发布时间】:2021-06-09 06:08:08
【问题描述】:

我正在尝试利用 postgres 返回纯 json 的特性,所以我向我的 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 注入潜力,是否可以使用准备好的语句之类的东西?

【问题讨论】:

  • 快速建议:您可以将... |> Tuple.to_list |> List.first 替换为... |> elem(0)
  • 谢谢@whatyouhide 我正要为此提出第二个问题:-)

标签: elixir ecto


【解决方案1】:

您正在寻找the documentation for Ecto.Adapters.SQL.query/4。 SQL 语句可以有数字变量,例如$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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    相关资源
    最近更新 更多