我试图通过用联接上的参数替换来避免任何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
结果截然不同!
一种选择是使用sanitize_sql_array方法。但是,它是一种受保护的方法,因此在您的类别模型上,您可以执行以下操作:
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中创建类方法。