2013-02-15 2 views
10

Sto cercando di passare una stringa al metodo .order, come ad esempioI parametri del metodo .order in ActiveRecord sono sterilizzati per impostazione predefinita?

Item.order(orderBy) 

Mi chiedevo se orderBy viene sterilizzata per impostazione predefinita e se no, quale sarebbe il modo migliore per disinfettare esso.

+0

Può fare un esempio del valore di stringa? Immagino che 'Item.order ("? ", OrderBy)' dovrebbe disinfettare, ma potrebbe esserci un modo migliore a seconda di cosa sei una stringa è – catsby

+0

@ctshryock che si tradurrà in un 'select * from items order by?, orderBy' –

+0

@DylanMarkow Stavo pensando a '.order (" created_at>? ", orderBy)' o simile, ma probabilmente è utile solo per 'where' (almeno non' order')? – catsby

risposta

14

L'ordine non viene disinfettato. Questa query effettivamente eliminare la tabella Utenti:

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

Ti consigliamo di controllare la variabile orderBy prima di eseguire la query se non c'è alcun modo orderBy potrebbe essere contaminato da input dell'utente. Qualcosa di simile potrebbe funzionare:

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

Grazie, Dylan! – andreimarinescu

2

io uso qualcosa di simile al seguente:

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

Dove Entity è la classe del modello.

3

Essi non sono sterilizzate nello stesso modo come clausola .where con ?, ma è possibile utilizzare #sanitize_sql_for_order:

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

Grazie. Questo è probabilmente il modo migliore per farlo. Tuttavia non sono sicuro che questo metodo ActiveRecord fosse disponibile 3 anni fa :) – andreimarinescu

+0

Questo in realtà è molto poco per disinfettare la parte dell'ordine. Qualcosa come 'sanitize_sql_for_order (" id, drop table somethings ") si comporterà ancora in modo imprevisto e il caso peggiore eliminerà la tabella:/ – nathanvda

+0

Verifica origine: https://github.com/rails/rails/blob/d15527800fbc199b969019c665226f836d8fedce/activerecord/lib/ active_record/sanitization.rb # L64 in caso di una singola stringa farà solo _nothing_ :( – nathanvda