rails 3 activerecord order - что такое правильный обход SQL инъекций? - PullRequest
14 голосов
/ 14 октября 2011

допустим, у меня есть страница со списком пользователей, и вы можете сортировать по разным столбцам, при нажатии на кнопку «электронная почта» она будет передавать sort_by = email sort_direction = asc или 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

, чтобы это работалокак и ожидалось, однако, если мы изменим 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

, теперь у нас больше нет пользователей: (* ​​1007 *

Я могу вручную создать белый список допустимых sort_by и сравнить параметры [: sort_by] с этим, но надеялся, что есть какой-то встроенный способ справиться с такими вещами

1 Ответ

26 голосов
/ 14 октября 2011

Метод Райана Бейтса:

в вашем контроллере:

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

По сути, вы делаете белый список, но это легко сделать и невосприимчиво к инъекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...