Recebendo dados do usuário: attr_accessible e attr_protected
Leia em 1 minuto
O Ruby on Rails permite que você defina os valores dos atributos de um objeto ActiveRecord através dos métodos new
e attributes
. A esse tipo de atribuição é dado o nome mass assignment. Tal tipo de atribuição facilita muito na hora de instanciar um novo objeto, pois você não precisa fazer a atribuição individualmente. Veja um exemplo.
# the old way
user = User.new
user.login = "rox"
user.email = "rox@example.com"
user.admin = true
# the ruby way
user = User.new(:login => "rox", :email => "rox@example.com", :admin => true)
Os mais atentos acabaram de identificar uma enorme falha de segurança, pois posso definir o tipo de um usuário — admin, neste caso — por enviar o atributo admin
no método params
.
# the "do whatever you want" way
user = User.new(params[:user])
Se você teve um mínimo de preocupação com a segurança de seu aplicativo, deve ter chegado aos métodos attr_protected
ou, melhor ainda, attr_accessible
. Ambos estipulam quais atributos podem ser definidos através do mass assignment. A grande diferença entre eles é que o método attr_protected
informa quais atributos são protegidos (não podem ser definidos), e o segundo trabalha no caminho contrário: você deve informar quais atributos podem ser definidos por mass assignment. Veja exemplos de como utilizar ambos os métodos.
class User < ActiveRecord::Base
# inform the attributes you want
# to protect
attr_protected :admin
end
class User < ActiveRecord::Base
# inform the attributes you want
# to allow mass assignment
attr_accessible :name, :login, :email
end
Apesar de ser mais trabalhoso, o método attr_accessible
, por ser restritivo, é mais seguro. Eu fico com ele, e você?