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

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でクラスメソッドを作成せずにそのメソッドを取得するためのその他のメソッドがいくつか用意されています。

于 2013-01-20T01:48:24.117 に答える
-1

試す

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

また、テーブルを結合するためのRailsのドキュメントを確認してください。

于 2013-01-20T01:11:33.520 に答える