【问题标题】:How to execute arbitrary parameterized SQL in rails如何在 Rails 中执行任意参数化 SQL
【发布时间】:2011-06-01 04:43:55
【问题描述】:

出于性能原因,我需要在我的 Rails 模型中编写一个新方法来执行一些任意 SQL:

UPDATE table
   SET col1 = ? AND col2 = ?
   WHERE id = ?

我知道我可以将ActiveRecord::Base.connection.executeActiveRecord::Base.connection.update 与SQL 字符串一起使用来获得我需要的结果,但是用实际参数值替换参数占位符(?)的正确过程是什么?是否有 Rails 方法可以将参数插入 SQL 语句,还是应该通过手动插值来完成?后者似乎不安全……

【问题讨论】:

标签: sql ruby-on-rails sql-injection


【解决方案1】:

你也可以这样做:

updates = ActiveRecord::Base.send(:sanitize_sql_array, ["name = ? and category = ?", name, category])
ActiveRecord::Base.connection.execute("update table set #{updates} where id = #{id.to_s.to_i}")

to_sto_i 之前被调用 id,以防它为 nil。

【讨论】:

  • 这不是回答问题,因为它使用字符串插值,因此容易受到 SQL 注入的影响。是的,我知道它使用了“已清理”的 sql 数组,但是长期以来,这些东西都不能很好地替代实际的安全性。所要求的是访问参数化查询,就像自 1980 年代以来所有健全的 dbms 系统一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-01
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
相关资源
最近更新 更多