Rails准备语句与select_all

Chr*_*dau 5 sql ruby-on-rails prepared-statement

据我所知,应该可以在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]])
Run Code Online (Sandbox Code Playgroud)

但遗憾的是,这根本不起作用.任何格式我尝试使用时,$1$2永远不会从绑定数组的相应值取代.

还有什么我应该照顾的吗?

Pat*_*NLT 5

您应该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
Run Code Online (Sandbox Code Playgroud)

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


Par*_*ngh -14

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

像这样使用它:

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]])
Run Code Online (Sandbox Code Playgroud)

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

谢谢

  • 这是如何在应用程序中创建 SQL 注入漏洞的教科书示例 - 在插值之前引用变量,或使用绑定变量。 (9认同)