ПОЛУЧИТЬ параметры в проекте ruby-on-rails - лучшие практики? - PullRequest
2 голосов
/ 26 марта 2010

Я унаследовал небольшое приложение rails, и мне нужно немного его расширить. Это на самом деле довольно просто, но я хочу убедиться, что я делаю это правильно ...

Если я захожу на myapp: 3000 / api / people, я получаю полный список людей в формате XML. Я хочу передать param в URL, чтобы я мог возвращать пользователей, которые соответствуют логину или электронной почте, например yapp: 3000 / api / people? login = jsmith даст мне человека с соответствующим логином. Вот код:

def index
  if params.size > 2 # We have 'action' & 'controller' by default
   if params['login']
      @person = [Person.find(:first, :conditions => { :login => params['login'] })]
    elsif params['email']
      @persons = [Person.find(:first, :conditions => { :email => params['email'] })]
    end
  else
    @persons = Person.find(:all)
  end
end

Два вопроса ...

  1. Это безопасно? Защищает ли ActiveRecord меня от атак с использованием SQL-инъекций (обратите внимание, я доверяю входящим параметрам)
  2. Это лучший способ сделать это, или есть какая-то автоматическая функция рельсов, с которой я не знаком?

Ответы [ 2 ]

4 голосов
/ 26 марта 2010
  1. Да, код, который вы перечислили, должен быть защищен от SQL-инъекций.
  2. Да, это обычно допустимый код рельсов ... но

Есть некоторые странности.

Ваше действие индекса говорит о @person и @persons.По соглашению ожидается @persons, а @person необычный.Я подозреваю, что вы можете устранить @person, и разобраться в один раз.Примерно так (не проверено):

def index
  @persons = if params[:email]
    Person.find_all_by_email(params[:email])
  elsif params[:login]
    Person.find_all_by_login(params[:login])
  else
    Person.all
  end
end 

Не забудьте обновить свое мнение - я подозреваю, что оно все еще ищет @person.Если ваш взгляд делает что-то «интересное» с @person, вы, вероятно, захотите перенести его в свое шоу-действие.

0 голосов
/ 26 марта 2010

Вот раздел руководства по безопасности ruby ​​on rails для SQL-инъекция . Похоже, что то, что вы имеете, используя условия хеширования, довольно безопасно. Похоже, использование Person.find_by_login или Person.find_by_email может быть немного лучше.

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