Desinfizieren Sie SQL in benutzerdefinierten Bedingungen
-
16-09-2019 - |
Frage
Ich brauche eine einfache Suche zu erstellen, aber ich kann nicht leisten, Sphinx zu verwenden.
Hier ist, was ich schrieb:
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 ')
Nun sanitize_sql_for_conditions funktioniert nicht! Es gibt einfach gibt die ursprüngliche Zeichenfolge.
Wie kann ich diesen Code neu schreiben bösartigen Code zu entkommen?
Lösung
Wenn Sie die „# {keyword}“ ersetzen mit einem „?“, Können Sie etwas tun. Mit dem Fragezeichen wird automatisch SQL sanieren.
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
Andere Tipps
Ich benutze eine Menge von benutzerdefinierten Bedingungen in Active, aber Ich mag sie in einem Array von Arrays Zustand verpacken, dann kombinieren ‚em, mit der? Wert lässt AR santize sie automatisch:
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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow