<?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? (scoped queries)</title>
    <link>http://www.sobretrilhos.com.br/articles/2007/07/31/aplicacoes-rails-seguras-scoped-queries</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? (scoped queries)</title>
      <description>&lt;p&gt;&amp;Eacute; verdade que utilizando todas as facilidades que o rails nos oferece, conseguimos criar aplica&amp;ccedil;&amp;otilde;es de forma muito r&amp;aacute;pida. Isso &amp;eacute; &amp;oacute;timo, mas &amp;agrave;s vezes, criamos uma aplica&amp;ccedil;&amp;atilde;o t&amp;atilde;o rapidamente, que ou esquecemos de olhar alguns aspectos de seguran&amp;ccedil;a ou n&amp;atilde;o sabemos o que acontece por debaixo dos panos e a&amp;iacute; deixamos a aplica&amp;ccedil;&amp;atilde;o exposta achando que tudo est&amp;aacute; funcionando redondo.&lt;/p&gt;

&lt;p&gt;Vou escrever uma s&amp;eacute;rie de artigos mostrando alguns pontos que merecem uma certa aten&amp;ccedil;&amp;atilde;o quando desenvolvemos nossas aplica&amp;ccedil;&amp;otilde;es em &lt;strong&gt;ruby on rails&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Queries restritas ou scoped queries&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Aplica&amp;ccedil;&amp;otilde;es rails costumam usar IDs de registros nas urls, como por exemplo &lt;em&gt;/contacts/show/28&lt;/em&gt; ou para ser RESTful &lt;em&gt;/contacts/28&lt;/em&gt;. Se tiv&amp;eacute;ssemos constru&amp;iacute;do nossa aplica&amp;ccedil;&amp;atilde;o assim:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class User &amp;lt; ActiveRecord::Base
  has_many :contacts
end

class Contact &amp;lt; ActiveRecord::Base
  belongs_to :user
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Os models s&amp;atilde;o bem simples. Agora o controller:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class ContactsController &amp;lt; ApplicationController

  before_filter :require_signin

  def new
    @contact = Contact.new
  end

  def create
    contact = Contact.new params[:contact]
    contact.user_id = session[:user_id]
    contact.save
    redirect_to contact_url(contact)
  end

  def show
    @contact = Contact.find params[:id]
  end

  private

    def require_signin
      return false unless session[:user_id]
    end

end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Consegue ver o problema? Ele est&amp;aacute; no action &lt;em&gt;show&lt;/em&gt;. Ainda n&amp;atilde;o viu? Repare que, qualquer pessoa, estando logada no sistema, pode ver qualquer contato. Mesmo que o contato n&amp;atilde;o perten&amp;ccedil;a a ela. Simplesmente acessando uma url &lt;em&gt;/contacts/show/id&lt;/em&gt;, passando o id que eu quiser, verei o contato em quest&amp;atilde;o.&lt;/p&gt;

&lt;p&gt;Para resolver isso, podemos fazer uma query com escopo definido. Como fazemos isso? Veja abaixo as modifica&amp;ccedil;&amp;otilde;es:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class ContactsController &amp;lt; ApplicationController

  # criamos o objeto @current_user
  before_filter :require_signin

  # safely looks up the contact
  before_filter :find_contact, 
          :except =&amp;gt; [ :index, :new, :create ]

  def index
    @contacts = @current_user.contacts.find :all
  end

  def new
    @contact = @current_user.contacts.new
  end

  def create
    @current_user.contacts.create params[:contact]
    redirect_to contacts_url
  end

  def show
  end

  def edit
  end

  def update
    @contact.update_attributes params[:contact]
    redirect_to contact_url
  end

  def destroy
    @contact.destroy
    redirect_to contacts_url
  end

  private

    def require_signin
      @current_user = User.find session[:user_id]
      redirect_to(home_url) and return false 
               unless @current_user
    end

    def find_contact
      @contact = @current_user.contacts.find params[:id]
    end

end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Veja que agora, n&amp;atilde;o acessamos mais o model &lt;em&gt;Contact&lt;/em&gt; diretamente. Todas as consultas ficam restritas ao usu&amp;aacute;rio logado no sistema e assim, apenas os contatos dele estar&amp;atilde;o vis&amp;iacute;veis.&lt;/p&gt;

&lt;p&gt;O pr&amp;oacute;ximo artigo falar&amp;aacute; de &lt;strong&gt;mass assignment&lt;/strong&gt;. Fiquem ligados.&lt;/p&gt;</description>
      <pubDate>Tue, 31 Jul 2007 15:15:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:c286322d-5232-46ad-baaa-dd9ca3cb5a63</guid>
      <author>Leonardo</author>
      <link>http://www.sobretrilhos.com.br/articles/2007/07/31/aplicacoes-rails-seguras-scoped-queries</link>
      <category>seguran&#231;a</category>
      <category>ruby on rails</category>
      <category>rails</category>
      <category>seguran&#231;a</category>
    </item>
    <item>
      <title>"Suas aplica&#231;&#245;es rails s&#227;o seguras? (scoped queries)" by Jaum</title>
      <description>Valew boa dica!!!</description>
      <pubDate>Tue, 07 Aug 2007 07:41:52 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:d44c0ba8-6af6-464a-bc9b-441ee1c278e4</guid>
      <link>http://www.sobretrilhos.com.br/articles/2007/07/31/aplicacoes-rails-seguras-scoped-queries#comment-2</link>
    </item>
    <item>
      <title>"Suas aplica&#231;&#245;es rails s&#227;o seguras? (scoped queries)" by Gustavo Yue</title>
      <description>Unnnn
gostei :D</description>
      <pubDate>Wed, 01 Aug 2007 07:43:19 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:c24a1acd-0678-4387-badc-9a8b78344b5c</guid>
      <link>http://www.sobretrilhos.com.br/articles/2007/07/31/aplicacoes-rails-seguras-scoped-queries#comment-1</link>
    </item>
  </channel>
</rss>
