【问题标题】:Rails Prepared Statement with select_all带有 select_all 的 Rails 准备好的语句
【发布时间】:2012-10-06 01:41:38
【问题描述】:

据我所知,在 Rails 中应该可以做到以下几点:

ActiveRecord::Base.connection.select_all("SELECT MONTH(created) AS month, YEAR(created) AS year FROM orders WHERE created>=$1 AND created<=$2 GROUP BY month ORDER BY month ASC",nil,[['created',1],['created',2]])

但遗憾的是,这根本不起作用。无论我尝试使用什么格式,$1$2 永远不会被绑定数组中的相应值替换。

还有什么需要注意的吗?

【问题讨论】:

    标签: sql ruby-on-rails prepared-statement


    【解决方案1】:

    您应该在模型中使用sanitize_sql_array,如下所示:

    r = self.sanitize_sql_array(["SELECT MONTH(created) AS month, YEAR(created) AS year FROM orders WHERE created>=? AND created<=? GROUP BY month ORDER BY month ASC", created1, created2])
    self.connection.select_all r
    

    这可以保护您免受 SQL 注入。

    【讨论】:

    • 也可以取哈希:sanitize_sql_array(['... where id = :id and type in (:types)', { id: _, types: _ }])
    【解决方案2】:

    由于您没有使用命名绑定,因此您可以这样做。这适用于 Rails 4.2。

    ActiveRecord::Base.connection.select_all(
      "SELECT MONTH(created) AS month, YEAR(created) AS year FROM orders WHERE created>=$1 AND created<=$2 GROUP BY month ORDER BY month ASC",
      nil,
      [[nil,'2016-01-01 12:30'],[nil,'2016-01-01 15:30']]
    )
    

    【讨论】:

    • 这还是一件事吗?在尝试命名参数时,我得到TypeError - TypeError: with nils 和NoMethodError - undefined method cast_type' for ...`。导轨 4.2.10。
    【解决方案3】:

    我不明白你是否尝试使用变量,但是使用变量很容易,你错误地使用了它们

    像这样使用它:

    ActiveRecord::Base.connection.select_all("SELECT MONTH(created) AS month, YEAR(created) AS year FROM orders WHERE created>=#{v1} AND created<=#{v2} GROUP BY month ORDER BY month ASC",nil,[['created',1],['created',2]])
    

    其中 v1 和 v2 是变量。 如果您正在尝试其他方法,请告诉我

    谢谢

    【讨论】:

    • 感谢您的帮助。实际上,我希望将 $1 和 $2 替换为 [['created',1],['created',2]],就像一个常见的准备好的 sql 语句一样。但无论我做什么,它都行不通。在像 ...where() 这样的普通 rails 模型语句中,它可以工作,但是使用那个 base.connection,我不知道该怎么做...
    • 这是一个教科书示例,说明如何在您的应用程序中创建 SQL 注入漏洞——在插值之前引用您的变量,或使用绑定变量。
    猜你喜欢
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多