Recebendo dados do usuário: attr_accessible e attr_protected

26/12/07

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ê?

Comentários #


#1 Carlos Brando disse:
26 Dez 07, 11:01PM

Boa dica!

#2 Thomaz Leite disse:
27 Dez 07, 01:37PM

Perfeito. Sempre use o attr_accessible por ele ser naturalmente à prova de falhas. Você vai perceber quando adicionar novas colunas nas tabelas do banco e não lembrar de protegê-las. É o mesmo conceito das blacklists e whitelists dos firewalls e anti-vírus.

#3 RoadHouse disse:
28 Dez 07, 03:07PM

acho que o nome disso é "estratégia deny-all" ou algo assim (pelo menos era no meio de segurança e coisa e tal) eu nunca tenho certeza de nada quando eu comento né? ;D

#4 nofxx disse:
11 Set 08, 08:51PM

"Deny-all policies" hehe…

Também fico com essa, tenho o rspec pra me lembrar sempre que esqueço de por um atributo lá.heh

Excelente conteúdo por aqui…. go rss

Deixe um comentário




Este blog usa o Gravatar.


Não é aceito código HTML:
adicione-o no pastie.caboo.se ou paste.milk-it.net e poste apenas o link.

Se este é seu primeiro comentário, ele terá que ser aprovado antes de ser exibido.