<?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</title>
    <link>http://www.sobretrilhos.com.br</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>Desenvolvendo a web com ruby on rails</description>
    <item>
      <title>Impress&amp;amp;otilde;es sobre o RejectConf SP 2007</title>
      <description>&lt;p&gt;Neste fim de semana, aconteceu o RejectConf SP 2007 e eu tive o prazer de estar presente. Dezenas de pessoas interessadas em &lt;a href="http://www.rubyonrails.org"&gt;Rails&lt;/a&gt; compareceram ao evento e ouviram palestras sobre os mais diversos assuntos.&lt;/p&gt;

&lt;p&gt;O &lt;a href="http://www.akitaonrails.com"&gt;Akita&lt;/a&gt; abriu a conf contando um pouco da trajet&amp;oacute;ria do Ruby e do Rails do in&amp;iacute;cio at&amp;eacute; os dias atuais. Falou do conceito de menos &amp;eacute; mais, empregado pela &lt;a href="http://www.37signals.com"&gt;37 signals&lt;/a&gt;, empresa de onde surgiu o framework Rails. Sobre este conceito, recomendo a leitura do livro &lt;a href="http://gettingreal.37signals.com/GR_por.php"&gt;Getting Real&lt;/a&gt;(traduzido), e assistir esta &lt;a href="http://video.google.com/videoplay?docid=6127548813950043200"&gt;palestra&lt;/a&gt;, feita por um professor de psicologia, explicando o paradoxo da escolha.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://rspec.rubyforge.org/"&gt;RSpec&lt;/a&gt; foi outro assunto que me interessou bastante. Apesar de ter sido um pouco r&amp;aacute;pido, o Danilo Sato conseguiu mostrar na pr&amp;aacute;tica um exemplo usando rspec com rails. Na minha opini&amp;atilde;o, o rspec deve crescer bastante e, talvez, ser mais utilizado que o xUnit. Para quem tem d&amp;uacute;vidas sobre se vale a penas investir no assunto, veja o que &lt;a href="http://video.google.com/videoplay?docid=8135690990081075324"&gt;Dave Astels&lt;/a&gt; tem a dizer nesta palestra.&lt;/p&gt;

&lt;p&gt;Apesar de j&amp;aacute; ter lido alguma coisa sobre o &lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt;, n&amp;atilde;o tinha tido a oportunidade de mexer com ele ainda. Por isso, achei bem legal ver o Fabio Kung, da &lt;a href="http://www.caelum.com.br"&gt;Caelum&lt;/a&gt;, mostrar as possibilidades de integra&amp;ccedil;&amp;atilde;o do Ruby com o Java. Com certeza, as implementa&amp;ccedil;&amp;otilde;es do JRuby e do IronRuby abrir&amp;atilde;o muitas portas para o Ruby. Vamos ficar de olho nelas :-)&lt;/p&gt;

&lt;p&gt;Pra fechar, o &lt;a href="http://www.nomedojogo.com"&gt;Carlos Brando&lt;/a&gt; fez uma palestra muito motivadora nos chamando para a a&amp;ccedil;&amp;atilde;o. Falou sobre in&amp;eacute;rcia e comodismo, que s&amp;atilde;o fatais para o desenvolvimento de qualquer pessoa.&lt;/p&gt;

&lt;p&gt;Resumo da &amp;oacute;pera: o evento foi excelente e todos os palestrantes est&amp;atilde;o de parab&amp;eacute;ns. Ficou claro para mim que Rails j&amp;aacute; n&amp;atilde;o &amp;eacute; mais brincadeira, e sim uma realidade no mercado brasileiro, e a tend&amp;ecirc;ncia &amp;eacute; aumentar. Para quem ainda n&amp;atilde;o v&amp;ecirc; benef&amp;iacute;cios nem tem curiosidades em Rails, acho que deveriam olhar o assunto com mais calma.&lt;/p&gt;

&lt;p&gt;O pr&amp;oacute;ximo evento que participarei ser&amp;aacute; o &lt;a href="http://www.rioonrails.com.br/"&gt;RioOnRails&lt;/a&gt;, no dia 8/dez. Sei tamb&amp;eacute;m que haver&amp;aacute; o &lt;a href="http://www.minasonrails.org/"&gt;MinasOnRails&lt;/a&gt; no dia 1/dez, mas infelizmente, n&amp;atilde;o poderei ir.&lt;/p&gt;</description>
      <pubDate>Mon, 19 Nov 2007 05:52:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:3de1b1ad-d0a3-4ae8-ba17-1abad0396ffb</guid>
      <author>Leonardo</author>
      <link>http://www.sobretrilhos.com.br/articles/2007/11/19/impressoes-reject-conf-sp</link>
      <category>ruby on rails</category>
      <category>rejectconf</category>
      <category>conferencias</category>
    </item>
    <item>
      <title>Falha de seguran&#231;a no plugin restful_authentication</title>
      <description>&lt;p&gt;Segundo este &lt;a href="http://www.rorsecurity.info/2007/10/28/restful_authentication-login-security/"&gt;post&lt;/a&gt; do blog de seguran&amp;ccedil;a de Ruby on Rails, o plugin &lt;a href="http://weblog.techno-weenie.net/2006/8/1/restful-authentication-plugin"&gt;Restful_Authentication&lt;/a&gt; cont&#233;m um falha de seguran&#231;a quando se utiliza a funcionalidade de ativa&#231;&#227;o de um cadastro.&lt;/p&gt;

&lt;p&gt;De acordo com o post, o plugin aceita receber o par&#226;metro &lt;em&gt;activation_code&lt;/em&gt; vazio assim:&lt;/p&gt;

&lt;p&gt;http://localhost:3000/user/activate ou http://localhost:3000/activate/?activation_code= &lt;/p&gt;

&lt;p&gt;dependendo das rotas criadas.&lt;/p&gt;

&lt;p&gt;Isto geraria a seguinte consulta SQL:&lt;/p&gt;

&lt;p&gt;SELECT * FROM users WHERE (users.&lt;code&gt;activation_code&lt;/code&gt; IS NULL) LIMIT 1&lt;/p&gt;

&lt;p&gt;A pessoa, ent&#227;o, poderia se logar sem senha com a primeira conta que tivesse o &lt;em&gt;activation_code&lt;/em&gt; vazio, ou seja, com um dos usu&#225;rios registrados.&lt;/p&gt;

&lt;p&gt;Pelo post, o dono do plugin j&#225; foi notificado e o mesmo j&#225; providenciou a corre&#231;&#227;o.&lt;/p&gt;

&lt;p&gt;Se voc&#234; usa, ou pensa em usar este plugin em algum de seus projetos, vale a pena pegar a &#250;ltima vers&#227;o ou trocar a primeira linha do m&#233;todo de ativa&#231;&#227;o para:&lt;/p&gt;

&lt;p&gt;self.current&lt;em&gt;user = params[:activation&lt;/em&gt;code].blank? ? :false : User.find&lt;em&gt;by_activation&lt;/em&gt;code(params[:activation_code]) &lt;/p&gt;

&lt;p&gt;n&#227;o esquecendo de acertar os nomes dos models caso tenha alterado.&lt;/p&gt;</description>
      <pubDate>Mon, 29 Oct 2007 11:20:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:eed2c95e-21e5-47ff-8df6-3f970d33a280</guid>
      <author>Leonardo</author>
      <link>http://www.sobretrilhos.com.br/articles/2007/10/29/falha-de-seguran%C3%A7a-no-plugin-restful_authentication</link>
      <category>seguran&#231;a</category>
      <category>restful_authentication</category>
      <category>plugin</category>
      <category>seguranca</category>
    </item>
    <item>
      <title>Teste seus conhecimentos de SEO</title>
      <description>&lt;p&gt;Lendo outros blogs hoje, encontrei este &lt;a href="http://www.seomoz.org/blog/the-seo-expert-quiz"&gt;quiz sobre otimiza&#231;&#227;o de buscadores&lt;/a&gt;. O teste &#233; muito interessante e cont&#233;m perguntas b&#225;sicas, intermedi&#225;rias e avan&#231;adas. &lt;/p&gt;

&lt;p&gt;Ele &#233; um pouco grande, tem 75 perguntas, e demora um pouco para fazer, mas recomendo tanto para aqueles que j&#225; tem conhecimento sobre otimiza&#231;&#227;o de buscadores quanto para aqueles que querem aprender sobre o assunto.&lt;/p&gt;</description>
      <pubDate>Tue, 11 Sep 2007 20:09:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:8e4afa97-5948-43f0-9b0b-8297bea334de</guid>
      <author>Leonardo</author>
      <link>http://www.sobretrilhos.com.br/articles/2007/09/11/quiz-seo</link>
      <category>SEO</category>
      <category>quiz</category>
      <category>seo</category>
    </item>
    <item>
      <title>&amp;quot;M&#225;gica&amp;quot; no Rails: vil&#227;o ou her&#243;i?</title>
      <description>&lt;p&gt;A quantidade de "m&#225;gica" existente no Rails pode auxiliar em muito o desenvolvimento de sites em termos de velocidade e facilidade, mas tamb&#233;m pode machucar feio o site em termos de performance, como mostra este &lt;a href="http://cfis.savagexi.com/articles/2007/07/18/making-rails-go-vroom"&gt;post&lt;/a&gt;. At&#233; que ponto o uso de "m&#225;gicas" &#233; prejudicial ou n&#227;o no desevolvimento de sites? Gostaria muito de saber a opini&#227;o de voc&#234;s sobre esse assunto.&lt;/p&gt;

&lt;p&gt;"M&#225;gica", para aqueles que n&#227;o conhecem o termo, s&#227;o partes de c&#243;digo que executam tarefas repetitivas ou com grande chance de erros ou ainda que facilitam a vida do usu&#225;rio. Por exemplo, quando se usa o m&#233;todo &lt;strong&gt;find&lt;/strong&gt; de um &lt;em&gt;model&lt;/em&gt; para localizar um registro no banco de dados, o Rails gera um SQL por debaixo dos panos para encontrar o registro solicitado. Ou quando se usa o m&#233;todo &lt;strong&gt;url_for&lt;/strong&gt; para gerar uma URL, o Rails analisa a tabela de rotas para poder gerar a URL correta.&lt;/p&gt;

&lt;p&gt;O problema nestes exemplos &#233; que nem sempre o SQL gerado &#233; o mais otimizado. E para que fazer o Rails perder tempo analisando a tabela de rotas se a &#250;nica coisa que se quer, na maiorias das vezes, &#233; colocar uma url do tipo /controller/action/id?  &lt;/p&gt;

&lt;p&gt;Sei que este assunto n&#227;o &#233; restrito ao Rails, mas, no Rails, parece ser levado ao extremo e ser um pouco a causa de tantas pessoas gostarem deste framework.&lt;/p&gt;</description>
      <pubDate>Sun, 02 Sep 2007 06:59:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:769066c7-57be-42f7-ada3-ba158d13b5ec</guid>
      <author>Leonardo</author>
      <link>http://www.sobretrilhos.com.br/articles/2007/09/02/magica-rails-vilao-ou-heroi</link>
      <category>performance</category>
      <category>performance</category>
      <category>magica</category>
    </item>
    <item>
      <title>Compress&#227;o de JS e CSS para aplica&#231;&#245;es Rails em produ&#231;&#227;o</title>
      <description>&lt;p&gt;Para quem &#233; um pouco neur&#243;tico com performance como eu, &lt;a href="http://synthesis.sbecker.net/"&gt;Scott Becker&lt;/a&gt; fez um excelente plugin, o &lt;a href="http://synthesis.sbecker.net/pages/asset_packager"&gt;AssetPackager&lt;/a&gt;, para comprimir e agrupar arquivos JS e CSS. O plugin foi baseado no artigo de Cal Henderson chamado &lt;a href="http://www.thinkvitamin.com/features/webapps/serving-javascript-fast"&gt;Serving Javascript Fast&lt;/a&gt; e utiliza o &lt;a href="http://www.crockford.com/javascript/jsmin.html"&gt;Javascript Minifier&lt;/a&gt; criado por &lt;a href="http://www.crockford.com/"&gt;Douglas Crockford&lt;/a&gt; e portado para o Ruby por Uladzislau Latynski.&lt;/p&gt;

&lt;p&gt;O plugin permite que voc&#234; desenvolva sua aplica&#231;&#227;o com quantos arquivos JS e CSS voc&#234; quiser e, na hora de passar sua aplica&#231;&#227;o para produ&#231;&#227;o, basta rodar um &lt;em&gt;rake task&lt;/em&gt; para comprimir e agrupar seus arquivos baseado na configura&#231;&#227;o que voc&#234; faz em um arquivo YAML. O helper que se utiliza nos &lt;em&gt;views&lt;/em&gt; chama os arquivos separados, se estiver em desenvolvimento, e chama os arquivos agrupados, se estiver em produ&#231;&#227;o.&lt;/p&gt;

&lt;p&gt;Outra caracter&#237;stica deste plugin &#233; a cria&#231;&#227;o dos arquivos agrupados com um &lt;em&gt;timestamp&lt;/em&gt; ou &lt;em&gt;SVN Revision&lt;/em&gt;, se existir, no pr&#243;rpio nome do arquivo e n&#227;o como &lt;em&gt;querystring&lt;/em&gt;, uma vez que nem todos os browsers colocam arquivos com &lt;em&gt;querystring&lt;/em&gt; no cache. Dessa forma, o browser pode cachear o arquivo correto e, caso haja alguma altera&#231;&#227;o, o nome do arquivo mudar&#225; for&#231;ando o browser a requisitar a nova vers&#227;o.&lt;/p&gt;

&lt;p&gt;Para mim, comprimir e agrupar esses arquivos &#233; essencial para economizar banda, reduzir a quantidade de requests e acelerar o carregamento das p&#225;ginas. Ainda pode resolver a quest&#227;o de vers&#227;o incorreta desses arquivos no cache do browser do usu&#225;rio. Realmente muito bom!&lt;/p&gt;</description>
      <pubDate>Thu, 23 Aug 2007 14:25:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:25fcfcc1-6fb4-4365-9d8d-e02e31bd6b24</guid>
      <author>Leonardo</author>
      <link>http://www.sobretrilhos.com.br/articles/2007/08/23/compressao-js-css-producao</link>
      <category>performance</category>
      <category>javascript</category>
      <category>CSS</category>
      <category>css</category>
      <category>javascript</category>
      <category>performance</category>
      <category>minifier</category>
      <category>compressao</category>
    </item>
    <item>
      <title>Interface de administra&#231;&#227;o</title>
      <description>&lt;p&gt;&#201; muito provav&#233;l que voc&#234; j&#225; tenha precisado fazer um m&#243;dulo de administra&#231;&#227;o para os modelos da sua aplica&#231;&#227;o. Pois &#233;, eu tamb&#233;m. A primeira coisa que me veio a cabe&#231;a foi usar o famoso &lt;strong&gt;scaffold&lt;/strong&gt;. Sabe aquela coisa: "Ah, isso n&#227;o tem tanta import&#226;ncia agora e depois eu fa&#231;o bonitinho". Acontece que a gente nunca volta para refazer nada.&lt;/p&gt;

&lt;p&gt;Ent&#227;o, resolvi ver o que as outras pessoas estavam fazendo com rela&#231;&#227;o a &lt;strong&gt;interfaces de administra&#231;&#227;o&lt;/strong&gt; e encontrei 3 plugins que podem adiantar a vida de qualquer um. S&#227;o eles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.activescaffold.com"&gt;ActiveScaffold&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.streamlinedframework.org/"&gt;Streamlined&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.trebex.net/auto-admin"&gt;AutoAdmin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;N&#227;o cheguei a instalar todos, mas pelos sites, os dois primeiros parecem estar mais desenvolvidos. O que eles trazem de vantagens sobre o scaffold comum &#233; que al&#233;m de ter uma apresenta&#231;&#227;o muito mais agrad&#225;vel, eles conseguem manipular associa&#231;&#245;es entre os modelos e permitem customiza&#231;&#245;es da interface de forma declarativa.&lt;/p&gt;

&lt;p&gt;Se voc&#234; tem um ambiente de administra&#231;&#227;o restrito, onde o essencial &#233; fazer o CRUD dos seus modelos, um desses plugins pode ser uma excelente pedida.&lt;/p&gt;</description>
      <pubDate>Thu, 16 Aug 2007 11:21:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:24fe9c16-81a8-48af-87df-8a82691f23eb</guid>
      <author>Leonardo</author>
      <link>http://www.sobretrilhos.com.br/articles/2007/08/16/interface-administracao</link>
      <category>ruby on rails</category>
      <category>interface</category>
      <category>administracao</category>
      <category>scaffold</category>
    </item>
    <item>
      <title>habtm ou has_many :through?</title>
      <description>&lt;p&gt;H&#225; alguns dias atr&#225;s, precisei criar uma associa&#231;&#227;o m x n e fiquei na d&#250;vida entre usar o has_and_belongs_to_many ou o has_many :through. Como sabia que o primeiro era o modo antigo de se fazer esse tipo de associa&#231;&#245;es, e o segundo o "novo", fui pesquisar um pouco mais para saber qual dos dois iria usar.&lt;/p&gt;

&lt;h1&gt;Habtm&lt;/h1&gt;

&lt;p&gt;O habtm funciona muito bem quando se quer apenas uma associa&#231;&#227;o simples, sem um modelo associado a essa tabela de relacionamento. Por associa&#231;&#227;o simples, quero dizer que a tabela de relacionamento n&#227;o possui mais nenhum campo al&#233;m dos ids das tabelas relacionadas. &lt;/p&gt;

&lt;h1&gt;Has_many :through&lt;/h1&gt;

&lt;p&gt;Se quisermos ter informa&#231;&#245;es adicionais na tabela de relacionamento ou um modelo onde podemos ter controle sobre os relacionamentos, ent&#227;o o has_many :through &#233; o caminho a seguir.&lt;/p&gt;

&lt;p&gt;A escolha acabou se tornando simples ap&#243;s essa pesquisa. Se tiver um relacionamento simples, escolha a primeira representa&#231;&#227;o. Caso contr&#225;rio, use a segunda.&lt;/p&gt;

&lt;p&gt;Outra coisa importante de se destacar &#233; que, se voc&#234; quiser seguir o estilo &lt;em&gt;REST&lt;/em&gt;, escolha o has_many :through porque, atrav&#233;s do modelo criado, &#233; poss&#237;vel expor o CRUD para esse relacionamento.&lt;/p&gt;</description>
      <pubDate>Sun, 12 Aug 2007 19:57:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:1844f212-b7d7-464a-9d68-2480013e8c01</guid>
      <author>Leonardo</author>
      <link>http://www.sobretrilhos.com.br/articles/2007/08/12/habtm-ou-has-many-through</link>
      <category>ruby on rails</category>
      <category>associa&#231;&#245;es</category>
      <category>relacionamento</category>
    </item>
    <item>
      <title>Suas aplica&#231;&#245;es rails s&#227;o seguras? (sql injection)</title>
      <description>&lt;p&gt;&lt;strong&gt;SQL Injection&lt;/strong&gt; &#233; um problema comum de ocorrer se n&#227;o tivermos cuidado com as informa&#231;&#245;es vindas dos usu&#225;rios, geralmente atrav&#233;s de formul&#225;rios. Um usu&#225;rio malicioso poderia, por exemplo, tentar ter acesso a um cadastro manipulando o formul&#225;rio de login de uma aplica&#231;&#227;o.&lt;/p&gt;

&lt;p&gt;A seguir, criarei um cen&#225;rio de login onde as informa&#231;&#245;es vindas do formul&#225;rio poder&#227;o ser manipuladas para ganhar acesso a aplica&#231;&#227;o, e depois, mostrarei como podemos evitar essa falha.&lt;/p&gt;

&lt;p&gt;Este poderia ser um &lt;em&gt;controller&lt;/em&gt; de autoriza&#231;&#227;o:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class User &amp;lt; ActiveRecord::Base
  def login
    @user = User.find(:first, 
                 :conditions =&amp;gt; "login = '#{params[:name]}' 
                 AND password = '#{params[:password]}'")
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Isso &#233; perigoso porque o s&#237;mbolo &lt;strong&gt;#&lt;/strong&gt; substitui a v&#225;ri&#225;vel diretamente pelo valor, sem nenhum tratamento. Ent&#227;o, se um usu&#225;rio entrasse com o seguinte nome e senha:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;params[:name] = ' OR '1'='1
params[:password] = ' OR '1'='1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;geraria esta consulta no banco:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;select * from users where login='' OR '1'='1' AND
                          password='' OR '1'='1' LIMIT 1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Com essa consulta, o usu&#225;rio entraria no site com o login do primeiro usu&#225;rio cadastrado no banco. Como a cl&#225;usula OR sempre ser&#225; &lt;em&gt;true&lt;/em&gt;, &#233; como se fiz&#233;ssemos o &lt;em&gt;select&lt;/em&gt; sem cl&#225;usula &lt;em&gt;where&lt;/em&gt; e isto retornaria a tabela inteira, mas com o &lt;em&gt;LIMIT 1&lt;/em&gt;, apenas o primeiro usu&#225;rio ser&#225; retornado. Muitas vezes esse usu&#225;rio pode ser at&#233; o administrador.&lt;/p&gt;

&lt;p&gt;Para resolver essa falha, reescreveremos o m&#233;todo de login assim:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  def login
    @user = User.find(:first, 
            :conditions =&amp;gt; ["login = ? AND password = ?"
            ,params[:name],params[:password]])
  end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Veja que agora passamos a condi&#231;&#227;o via &lt;em&gt;array&lt;/em&gt; sendo o primeiro &#237;ndice a condi&#231;&#227;o propriamente dita e, a partir do segundo &#237;ndice, as vari&#225;veis, j&#225; tratadas pelo &lt;em&gt;Rails&lt;/em&gt;, que ser&#227;o substitu&#237;das pelo s&#237;mbolo &lt;strong&gt;?&lt;/strong&gt; na mesma ordem que os s&#237;mbolos aparecem.&lt;/p&gt;

&lt;p&gt;Com isso, podemos entrar com aqueles valores anteriores que n&#227;o haver&#225; problemas, pois os caracteres especiais foram tratados.&lt;/p&gt;</description>
      <pubDate>Tue, 07 Aug 2007 22:12:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:9f696048-ef08-4c4a-a06b-8859273f7411</guid>
      <author>Leonardo</author>
      <link>http://www.sobretrilhos.com.br/articles/2007/08/07/aplicacoes-rails-seguras-sql-injection</link>
      <category>seguran&#231;a</category>
      <category>ruby on rails</category>
      <category>sql injection</category>
      <category>ruby</category>
    </item>
    <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>
    <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>
  </channel>
</rss>
