<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.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? (sql injection)</title>
    <link>http://www.sobretrilhos.com.br/articles/2007/08/07/aplicacoes-rails-seguras-sql-injection</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? (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 +0000</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? (sql injection)" by teste</title>
      <description>alert('xss')</description>
      <pubDate>Mon, 19 Nov 2007 07:10:48 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:d4e7ab00-ee28-4c96-bb6c-5fc889ee6c4d</guid>
      <link>http://www.sobretrilhos.com.br/articles/2007/08/07/aplicacoes-rails-seguras-sql-injection#comment-9</link>
    </item>
    <item>
      <title>"Suas aplica&#231;&#245;es rails s&#227;o seguras? (sql injection)" by pshlhkvekl</title>
      <description>Thanks for this site!
 &lt;a &gt;http://wsjml.cn/gkuooqtla.html&lt;/a rel="nofollow"&gt;</description>
      <pubDate>Wed, 15 Aug 2007 14:29:27 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:25658ef2-14d6-4879-aee2-413edac33c79</guid>
      <link>http://www.sobretrilhos.com.br/articles/2007/08/07/aplicacoes-rails-seguras-sql-injection#comment-4</link>
    </item>
    <item>
      <title>"Suas aplica&#231;&#245;es rails s&#227;o seguras? (sql injection)" by skuztmjcmk</title>
      <description>Hello! Good Site! Thanks you! xuugxuxinjldlc</description>
      <pubDate>Tue, 14 Aug 2007 20:31:24 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:04d614b2-3f55-4006-a429-6946e5462d53</guid>
      <link>http://www.sobretrilhos.com.br/articles/2007/08/07/aplicacoes-rails-seguras-sql-injection#comment-3</link>
    </item>
  </channel>
</rss>

