2

簡単な検索を作成する必要がありますが、Sphinx を使用する余裕はありません。

ここに私が書いたものがあります:


keywords = input.split(/\s+/)
queries = []

keywords.each do |keyword|
  queries << sanitize_sql_for_conditions(
              "(classifications.species LIKE '%#{keyword}%' OR 
               classifications.family LIKE '%#{keyword}%' OR 
               classifications.trivial_names LIKE '%#{keyword}%' OR
               place LIKE '%#{keyword}%')")
end

options[:conditions] = queries.join(' AND ')

今、sanitize_sql_for_conditions は機能しません! 元の文字列を返すだけです。

このコードを書き直して、悪意のあるコードを回避するにはどうすればよいですか?

4

2 に答える 2

9

「#{keyword}」を「?」に置き換えると、このようなことができます。疑問符を使用すると、SQL が自動的にサニタイズされます。

keywords = input.split(/\s+/)
queries = []
vars = []

keywords.each do |keyword|
  queries << "(classifications.species LIKE '%?%' OR 
               classifications.family LIKE '%?%' OR 
               classifications.trivial_names LIKE '%?%' OR
               place LIKE '%?%')"
  vars = vars << keyword << keyword << keyword << keyword
end

options[:conditions] = [queries.join(' AND '), vars].flatten
于 2009-07-17T14:43:13.373 に答える
0

私は ActiveRecord で多くのカスタム条件を使用しますが、それらを条件配列の配列にパッケージ化してから、? を使用して結合するのが好きです。value を指定すると、AR はそれらを自動的にサニタイズします。

conditions = Array.new
conditions << ["name = ?", "bob"]
conditions << ["(created_at > ? and created_at < ?)", 1.year.ago, 1.year.from_now]  

User.find(:first, :conditions => combine_conditions(conditions))

 def combine_conditions(somearray) # takes an array of condition set arrays and reform them into a AR-compatible condition array
   conditions = Array.new
   values = Array.new
   somearray.each do |conditions_array|
     conditions << conditions_array[0] # place the condition in an array
     # extract values
     for i in (1..conditions_array.size - 1)
       values << conditions_array[i]
     end 
   end
   [conditions.join(" AND "), values].flatten
 end
于 2010-12-13T20:33:37.177 に答える