2013-02-15 10 views
10

Ich versuche, eine Zeichenfolge in die .order Methode zu übergeben, wieSind die .order-Methodenparameter in ActiveRecord standardmäßig bereinigt?

Item.order(orderBy) 

Ich frage mich, ob orderBy standardmäßig aktiviert und wenn nicht desinfiziert wird, was der beste Weg, um es zu sanieren wäre.

+0

Können Sie ein Beispiel für die String-Wert geben? Ich stelle mir vor, 'Item.order ("? ", OrderBy)' sollte bereinigen, aber es könnte einen besseren Weg geben, je nachdem, was Sie string sind – catsby

+0

@ctshryock, die nur in eine 'select * from items order by? orderBy' –

+0

@DylanMarkow Ich dachte '.order (" created_at>? ", orderBy)' oder ähnlich, aber das ist wahrscheinlich nur gut für 'wo' (zumindest nicht' order')? – catsby

Antwort

14

Die Bestellung wird nicht bereinigt. Diese Abfrage wird fallen tatsächlich die Tabelle Benutzer:

Post.order("title; drop table users;") 

Sie werden die orderBy Variable überprüfen möchten, bevor die Abfrage ausgeführt wird, wenn es irgendeine Art und Weise orderBy von Benutzereingaben verdorben werden könnte. So etwas wie dies funktionieren könnte:

items = Item.scoped 
if Item.column_names.include?(orderBy) 
    items = items.order(orderBy) 
end 
+0

Danke, Dylan! – andreimarinescu

2

Ich verwende etwas wie folgt aus:

@scoped = @scoped.order Entity.send(:sanitize_sql, "#{@c} #{@d}") 

Wo Entity die Modellklasse ist.

3

Sie sind in der gleichen Weise wie eine .where Klausel nicht hygienisiert mit ?, aber Sie können #sanitize_sql_for_order verwenden:

sanitize_sql_for_order(["field(id, ?)", [1,3,2]]) 
# => "field(id, 1,3,2)" 

sanitize_sql_for_order("id ASC") 
# => "id ASC" 

http://api.rubyonrails.org/classes/ActiveRecord/Sanitization/ClassMethods.html#method-i-sanitize_sql_for_order

+0

Danke. Dies ist wahrscheinlich der beste Weg, dies zu tun. Allerdings bin ich mir nicht sicher, dass diese ActiveRecord-Methode vor 3 Jahren verfügbar war :) – andreimarinescu

+0

Dies tut eigentlich sehr wenig, um den Bestell-Teil zu desinfizieren. Etwas wie 'sanitize_sql_for_order ("id; drop table somethings") wird sich immer noch unerwartet verhalten und im schlimmsten Fall die Tabelle löschen:/ – nathanvda

+0

Quelle überprüfen: https://github.com/rails/rails/blob/d15527800fbc199b969019c665226f836d8fedce/activerecord/lib/ active_record/sanitization.rb # L64 im Falle einer einzelnen Zeichenfolge wird es einfach _nothing_ :( – nathanvda

Verwandte Themen