3

我试图通过在连接上用我的参数替换来避免任何 SQL 注入漏洞。

Category.joins("LEFT OUTER JOIN incomes ON incomes.category_id = categories.id AND incomes.dept_id = ?", params[:Dept])

这会尝试执行带有问号的查询,而不是用它代替参数。这样做的正确方法是什么?

编辑:

查询需要返回:

SELECT categories.* 
FROM "categories" 
LEFT OUTER JOIN incomes 
ON incomes.category_id = categories.id AND incomes.dept_id = 86

不是

SELECT categories.* 
FROM "categories" 
LEFT OUTER JOIN incomes 
ON incomes.category_id = categories.id 
WHERE incomes.dept_id = 86

非常不同的结果!

4

2 回答 2

7

一种选择是使用sanitize_sql_array方法。但是,它是一种受保护的方法,因此您可以在 Category 模型上执行以下操作:

class Category < ActiveRecord::Base
  def self.income_for_dept(dept)
    Category.joins(sanitize_sql_array(["LEFT OUTER JOIN incomes ON incomes.category_id = categories.id AND incomes.dept_id = ?", dept]))
  end
end

然后你会这样称呼它:

Category.income_for_dept(params[:Dept])

如果需要,Ruby 提供了一些其他方法来获取该方法,而无需在 Category 中创建类方法。

于 2013-01-20T01:48:24.117 回答
-1

尝试

Category.joins(:incomes).where(:incomes => { :dept_id => params[:Dept] })

并查看Rails 文档以了解连接表

于 2013-01-20T01:11:33.520 回答