ruby on rails защищает update_attributes от внедрения SQL? - PullRequest
3 голосов
/ 07 июля 2010

Защищает ли update_attributes от SQL-инъекций?

Пример:

 if @user.update_attributes(params[:user])
     # updated
 end 

Я знаю, что find () и {} и [] выполняют условия find:, но не видели никакой информации об этом методе.

Ответы [ 2 ]

5 голосов
/ 22 февраля 2011

Да, это так.Внутренне он просто перебирает все атрибуты, устанавливает их значения, затем вызывает save!

def update_attributes(attributes)
  with_transaction_returning_status do
    self.attributes = attributes
    save
  end
end

def attributes=(new_attributes, guard_protected_attributes = true)
  ...
  attributes.each do |k, v|
    if k.include?("(")
      multi_parameter_attributes << [ k, v ]
    elsif respond_to?("#{k}=")
      send("#{k}=", v)
    else
      raise(UnknownAttributeError, "unknown attribute: #{k}")
    end
  end
end

Другими словами, он делает

m.update_attributes(:attr1 => "foo", :attr2 => "bar")

m.attr1 = "foo"
m.attr2 = "bar"
m.save
2 голосов
/ 22 февраля 2011

Все методы activerecord в Rails3, которые взаимодействуют с базой данных, защищены от внедрения SQL.

Единственное исключение - если вы используете сырой SQL для одного из параметров, например:

Comment.find(:all, :conditions => "user_id = #{params[:user]}")

предпочтительная форма:

Comment.find(:all, :conditions => {:user_id => params[:user})

, которая будет автоматически защищена от внедрения SQL.

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