小编典典

在连接中使用占位符

sql

我试图通过用联接上的参数替换来避免任何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

结果截然不同!


阅读 209

收藏
2021-03-23

共1个答案

小编典典

一种选择是使用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中创建类方法。

2021-03-23