<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/stylesheets/rss.css" type="text/css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Sobre Trilhos: Suas aplica&#231;&#245;es rails s&#227;o seguras? (mass assignment)</title>
    <link>http://www.sobretrilhos.com.br/articles/2007/08/02/suas-aplica%C3%A7%C3%B5es-rails-s%C3%A3o-seguras-mass-assignment</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>Desenvolvendo a web com ruby on rails</description>
    <item>
      <title>Suas aplica&#231;&#245;es rails s&#227;o seguras? (mass assignment)</title>
      <description>&lt;p&gt;Mass assignment &#233; uma ferramenta muito poderosa que o &lt;em&gt;ActiveRecord&lt;/em&gt; nos fornece. Com ela, podemos criar um objeto, passando todas as informa&#231;&#245;es de um formul&#225;rio, simplesmente com uma linha de c&#243;digo. Mas, sem tomar as devidas precau&#231;&#245;es, podemos nos encrencar feio criando falhas de seguran&amp;ccedil;a na aplica&amp;ccedil;&amp;atilde;o.&lt;/p&gt;

&lt;p&gt;Vejamos um exemplo simples de como isso pode acontecer. Suponha que tenhamos esse &lt;em&gt;migration&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class CreateUsers &amp;lt; ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.column :name, :string
      t.column :admin, :boolean
    end
  end

  def self.down
    drop_table :users
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;esse &lt;em&gt;controller&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class UserController &amp;lt; ApplicationController
  def create
    @user = User.create(params[:user])
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;e esse &lt;em&gt;view&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;form method="post" action="/user/create"&amp;gt;
  &amp;lt;input type="text" name="user[name]" /&amp;gt;
&amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Tudo pronto e funcionando. At&#233; que de repente, algu&#233;m resolver brincar um pouco com os dados do formul&#225;rio e submete um form com os seguintes dados:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;form method="post" action="/user/create"&amp;gt;
  &amp;lt;input type="text" name="user[name]" /&amp;gt;
  &amp;lt;input type="hidden" name="user[admin]" value="1" /&amp;gt;
&amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pronto. O usu&#225;rio agora tamb&#233;m &#233; um administrador e pode fazer coisas desastrosas.&lt;/p&gt;

&lt;p&gt;Podemos resolver isso dizendo para o &lt;em&gt;model&lt;/em&gt; quais s&amp;atilde;o os campos protegidos e que ser&amp;atilde;o ignorados pelo &lt;em&gt;mass assignment&lt;/em&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class User &amp;lt; ActiveRecord::Base
  attr_protected :admin
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Outra forma de resolver o problema, &amp;eacute; dizendo para o &lt;em&gt;model&lt;/em&gt; quais s&amp;atilde;o os campos permitidos para &lt;em&gt;mass assignment&lt;/em&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class User &amp;lt; ActiveRecord::Base
  attr_accessible :name
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A diferen&amp;ccedil;a entre as duas abordagens &amp;eacute;, que na primeira, os campos s&amp;atilde;o permitidos por default  e somente os campos listados s&amp;atilde;o protegidos, enquanto que na segunda acontece justamente o contr&amp;aacute;rio.&lt;/p&gt;

&lt;p&gt;Particularmente, acho a segunda abordagem mais segura, porque, se criarmos mais campos posteriormente, eles estar&amp;atilde;o protegidos por default.&lt;/p&gt;

&lt;p&gt;A seguir, falarei de &lt;strong&gt;SQL Injection&lt;/strong&gt;.&lt;/p&gt;</description>
      <pubDate>Thu, 02 Aug 2007 18:22:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:7c7be107-63b6-407a-a1ff-f0b5d88456a2</guid>
      <author>Leonardo</author>
      <link>http://www.sobretrilhos.com.br/articles/2007/08/02/suas-aplica%C3%A7%C3%B5es-rails-s%C3%A3o-seguras-mass-assignment</link>
      <category>seguran&#231;a</category>
      <category>ruby on rails</category>
      <category>seguran&#231;a</category>
      <category>rails</category>
    </item>
  </channel>
</rss>
