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





Não é aceito código HTML: adicione-o no pastie.org 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.

jQuery: Dominando o framework

Você quer aprender a usar jQuery de verdade? Então chegou a hora! Neste workshop você verá como funciona este framework de JavaScript, entendendo todos os aspectos que fazem do jQuery uma das melhores ferramentas para desenvolvimento de interfaces.

Saiba mais Fechar

Conheça também o HOWTO