Rieles 3 orden activerecord – ¿cuál es la inyección de SQL adecuada alrededor?

digamos que tengo una página de lista de usuarios y puede ordenar por las diferentes columnas, al hacer clic en ‘correo electrónico’ pasará sort_by = email sort_direction = asc o desc

sort_by = "email" # really params[:sort_by] sort_direction = "asc" # really params[:sort_direction] User.order("#{sort_by} #{sort_direction}") # SELECT "users".* FROM "users" ORDER BY email asc 

para que funcione como se espera, sin embargo, si cambiamos el sort_by

 sort_by = "email; DELETE from users; --" User.order("#{sort_by} #{sort_direction}") # SELECT "users".* FROM "users" ORDER BY email; DELETE from users; -- asc 

ahora no tenemos más usuarios 🙁

Puedo construir manualmente una lista blanca de sort_by válido y comparar params [: sort_by] a eso, pero esperaba que haya alguna forma de manejar este tipo de cosas

Método de Ryan Bates:

en tu controlador:

 def index @users = User.order(sort_by + " " + direction) end private def sort_by %w{email name}.include?(params[:sort_by]) ? params[:sort_by] : 'name' end def direction %w{asc desc}.include?(params[:direction]) ? params[:direction] : 'asc' end 

Básicamente, estás haciendo una lista blanca, pero es fácil de hacer e insensible a la inyección.