<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>protected  * void &#187; Segurança</title>
	<atom:link href="http://www.danilocesar.com/blog/category/seguranca/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.danilocesar.com/blog</link>
	<description>Tecnologia, Linux e Software Livre</description>
	<lastBuildDate>Thu, 30 Sep 2010 16:00:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>WTF???</title>
		<link>http://www.danilocesar.com/blog/2008/07/25/wtf/</link>
		<comments>http://www.danilocesar.com/blog/2008/07/25/wtf/#comments</comments>
		<pubDate>Fri, 25 Jul 2008 05:57:26 +0000</pubDate>
		<dc:creator>Danilo Cesar</dc:creator>
				<category><![CDATA[/dev/null]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mandriva]]></category>
		<category><![CDATA[Quick Tip]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[SL]]></category>

		<guid isPermaLink="false">http://www.danilocesar.com/blog/?p=145</guid>
		<description><![CDATA[Agora pouco digitei um endereço errado e tive acesso à uma infeliz página: WTF??? Outro teste: OK, já passou da hora usar OpenDNS!]]></description>
			<content:encoded><![CDATA[<p>Agora pouco digitei um endereço errado e tive acesso à uma infeliz página:</p>
<p><a href="http://www.danilocesar.com/blog/wp-content/uploads/2008/07/picture-1.png"><img class="alignnone size-full wp-image-147" title="WTF?" src="http://www.danilocesar.com/blog/wp-content/uploads/2008/07/picture-1.png" alt="" width="500" height="420" /></a></p>
<p>WTF???</p>
<p>Outro teste:</p>
<p><a href="http://www.danilocesar.com/blog/wp-content/uploads/2008/07/picture-3.png"><img class="alignnone size-full wp-image-149" title="WTF2?" src="http://www.danilocesar.com/blog/wp-content/uploads/2008/07/picture-3.png" alt="" width="499" height="122" /></a></p>
<p>OK, já passou da hora usar OpenDNS!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danilocesar.com/blog/2008/07/25/wtf/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Hello world para Native-Symbian</title>
		<link>http://www.danilocesar.com/blog/2008/05/06/hello-world-para-native-symbian/</link>
		<comments>http://www.danilocesar.com/blog/2008/05/06/hello-world-para-native-symbian/#comments</comments>
		<pubDate>Wed, 07 May 2008 01:00:03 +0000</pubDate>
		<dc:creator>Danilo Cesar</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[PyS60]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Quick Tip]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[Ubuntu-Br]]></category>
		<category><![CDATA[viagens]]></category>
		<category><![CDATA[Mobile]]></category>

		<guid isPermaLink="false">http://www.danilocesar.com/blog/?p=132</guid>
		<description><![CDATA[Certa vez eu quis explicar a um amigo porque escrever código em python para celular era mais legal que escrever código em C (native-symbian e não OpenC). Acho que hoje talvez eu consiga. Segue os exemplos: Python print "Hello World" C++-Epoc // Hello World in C++, Epoc style (for Symbian OS) #include < eikapp.h > [...]]]></description>
			<content:encoded><![CDATA[<p>Certa vez eu quis explicar a um amigo porque escrever código em <a href="http://sourceforge.net/projects/pys60" target="_blank">python</a> para celular era mais legal que escrever código em C (<a href="http://forum.nokia.com/main/resources/technologies/symbian/index.html" target="_blank">native-symbian</a> e não <a href="http://www.forum.nokia.com/main/resources/technologies/open_c/index.html" target="_blank">OpenC</a>). Acho que hoje talvez eu consiga.</p>
<p>Segue os exemplos:</p>
<h3>Python</h3>
<p><code>print "Hello World" </code></p>
<h3>C++-Epoc</h3>
<p><code><br />
// Hello World in C++, Epoc style (for Symbian OS)<br />
#include < eikapp.h ><br />
#include < eikdoc.h ><br />
#include < eikappui.h ></p>
<p>class CHelloWorldAppUi;<br />
class CEikApplication;<br />
class CHelloWorldAppView;</p>
<p>class CHelloWorldApplication : public CEikApplication<br />
    {<br />
        public:<br />
            TUid AppDllUid() const;<br />
        protected:<br />
            CApaDocument* CreateDocumentL();<br />
    };</p>
<p>class CHelloWorldDocument : public CEikDocument<br />
    {<br />
        public:<br />
            static CHelloWorldDocument* NewL(CEikApplication&#038; aApp);<br />
            static CHelloWorldDocument* NewLC(CEikApplication&#038; aApp);<br />
            ~CHelloWorldDocument(){};<br />
        public:<br />
            CEikAppUi* CreateAppUiL();<br />
        private:<br />
            void ConstructL() {};<br />
            CHelloWorldDocument(CEikApplication&#038; aApp){};<br />
    };</p>
<p>class CHelloWorldAppUi : public CEikAppUi<br />
    {<br />
        public:<br />
                void ConstructL();<br />
                CHelloWorldAppUi(){};<br />
                ~CHelloWorldAppUi(){};<br />
    };</p>
<p>static const TUid KUidHelloWorldApp = {0x10005B91};</p>
<p>GLDEF_C TInt E32Dll(TDllReason )<br />
    {<br />
    return KErrNone;<br />
    }</p>
<p>EXPORT_C CApaApplication* NewApplication()<br />
    {<br />
    return (new CHelloWorldApplication);<br />
    }</p>
<p>CApaDocument* CHelloWorldApplication::CreateDocumentL()<br />
    {<br />
    CApaDocument* document = CHelloWorldDocument::NewL(*this);<br />
    return document;<br />
    }</p>
<p>TUid CHelloWorldApplication::AppDllUid() const<br />
    {<br />
    return KUidHelloWorldApp;<br />
    }</p>
<p>CHelloWorldDocument* CHelloWorldDocument::NewL(CEikApplication&#038; aApp)<br />
    {<br />
    CHelloWorldDocument* self = NewLC(aApp);<br />
    CleanupStack::Pop(self);<br />
    return self;<br />
    }</p>
<p>CHelloWorldDocument* CHelloWorldDocument::NewLC(CEikApplication&#038; aApp)<br />
    {<br />
    CHelloWorldDocument* self = new (ELeave) CHelloWorldDocument(aApp);<br />
    CleanupStack::PushL(self);<br />
    self->ConstructL();<br />
    return self;<br />
    }</p>
<p>CEikAppUi* CHelloWorldDocument::CreateAppUiL()<br />
    {<br />
    CEikAppUi* appUi = new (ELeave) CHelloWorldAppUi;<br />
    return appUi;<br />
    }</p>
<p>void CHelloWorldAppUi::ConstructL()<br />
    {<br />
    BaseConstructL();</p>
<p>    _LIT(message,"Hello!");<br />
    CAknInformationNote* informationNote = new (ELeave) CAknInformationNote;<br />
    informationNote->ExecuteLD(message);<br />
    }<br />
</code></p>
<p><em>fonte: <a href="href="http://www.roesler-ac.de/wolfram/hello.htm">http://www.roesler-ac.de/wolfram/hello.htm</a> </em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.danilocesar.com/blog/2008/05/06/hello-world-para-native-symbian/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PHP e Null Bytes issues</title>
		<link>http://www.danilocesar.com/blog/2007/08/24/php-e-null-bytes-issues/</link>
		<comments>http://www.danilocesar.com/blog/2007/08/24/php-e-null-bytes-issues/#comments</comments>
		<pubDate>Fri, 24 Aug 2007 14:29:54 +0000</pubDate>
		<dc:creator>Danilo Cesar</dc:creator>
				<category><![CDATA[/dev/null]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Quick Tip]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[Ubuntu-Br]]></category>

		<guid isPermaLink="false">http://www.danilocesar.com/blog/2007/08/24/php-e-null-bytes-issues/</guid>
		<description><![CDATA[if (file_exists(realpath($_GET['teste'] . ".php"))){ echo 'OK'; } else{ echo 'Fail'; } Aparentemente esta verificação é bastante segura né? Infelizmente não. O PHP usa o padrão de strings usado em C (aquelas terminadas com &#8216;\0&#8242;), o que gera um problema bastante conhecido chamado de Null Byte issue [1]. O que acontece se seu $_GET['teste'], aparentemente seguro, [...]]]></description>
			<content:encoded><![CDATA[<p><code lang="php"></p>
<p>if (file_exists(realpath($_GET['teste'] . ".php"))){<br />
echo 'OK';<br />
}<br />
else{<br />
echo 'Fail';<br />
}<br />
</code></p>
<p>Aparentemente esta verificação é bastante segura né?</p>
<p>Infelizmente não. O PHP usa o padrão de strings usado em C (aquelas terminadas com &#8216;\0&#8242;), o que gera um problema bastante conhecido chamado de Null Byte issue [1].</p>
<p>O que acontece se seu $_GET['teste'], aparentemente seguro, tiver um &#8216;\0&#8242;?<br />
Sua função realpath vai verificar apenas o $_GET['teste'] e nem vai saber que existe um &#8220;.php&#8221;</p>
<p>Faça o teste:</p>
<p>http://localhost/labs/teste.php?teste=/etc/passwd%00</p>
<p>(%00 é o código hexadecimal aceito pelos browsers para o \0)</p>
<p>E o resultado:</p>
<p><code>OK</code></p>
<p>[1] <a href="http://en.wikipedia.org/wiki/Null_character">http://en.wikipedia.org/wiki/Null_character</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.danilocesar.com/blog/2007/08/24/php-e-null-bytes-issues/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>sudo sem senha para comandos essenciais.</title>
		<link>http://www.danilocesar.com/blog/2007/06/08/sudo-sem-senha-para-comandos-essenciais/</link>
		<comments>http://www.danilocesar.com/blog/2007/06/08/sudo-sem-senha-para-comandos-essenciais/#comments</comments>
		<pubDate>Fri, 08 Jun 2007 03:02:31 +0000</pubDate>
		<dc:creator>Danilo Cesar</dc:creator>
				<category><![CDATA[/dev/null]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Quick Tip]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[Ubuntu-Br]]></category>

		<guid isPermaLink="false">http://www.danilocesar.com/blog/2007/06/08/sudo-sem-senha-para-comandos-essenciais/</guid>
		<description><![CDATA[Dica rápida de uma pergunta que rolou na lista de discução do Ubuntu-BR: Executar um sudo /sbin/halt, mas sem precisar digitar a senha. Fácil! Vá até a linha de comando e digite: sudo visudo Será aberto um editor. Ao fim deste arquivo, ponha a seguinte linha: %admin ALL=NOPASSWD: /sbin/halt Calma calma, vou explicar: Isto significa: [...]]]></description>
			<content:encoded><![CDATA[<p>Dica rápida de uma pergunta que rolou na lista de discução do Ubuntu-BR:</p>
<p>Executar um <em><strong>sudo /sbin/halt</strong></em>, mas sem precisar digitar a senha.</p>
<p>Fácil!</p>
<p>Vá até a linha de comando e digite:</p>
<p><code>sudo visudo</code></p>
<p>Será aberto um editor. Ao fim deste arquivo, ponha a seguinte linha:<br />
<code><br />
%admin ALL=NOPASSWD: /sbin/halt<br />
</code></p>
<p>Calma calma, vou explicar:<br />
Isto significa: Para todo usuário do grupo admin, não exiga senha para o comando /sbin/halt</p>
<p>Simples não?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danilocesar.com/blog/2007/06/08/sudo-sem-senha-para-comandos-essenciais/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Túnel SSH com Proxy Socks: Agora em sabor Transparente!</title>
		<link>http://www.danilocesar.com/blog/2007/05/29/tunel-ssh-com-proxy-socks-agora-em-sabor-transparente/</link>
		<comments>http://www.danilocesar.com/blog/2007/05/29/tunel-ssh-com-proxy-socks-agora-em-sabor-transparente/#comments</comments>
		<pubDate>Wed, 30 May 2007 02:09:46 +0000</pubDate>
		<dc:creator>Danilo Cesar</dc:creator>
				<category><![CDATA[HTTP]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Portáteis]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[Ubuntu-Br]]></category>

		<guid isPermaLink="false">http://www.danilocesar.com/blog/2007/05/29/tunel-ssh-com-proxy-socks-agora-em-sabor-transparente/</guid>
		<description><![CDATA[Há muito tempo que eu queria saber um pouco mais sobre os tais túneis SSH. Depois de procurar um pouco, achei um artigo que poderia me ajudar a fazer um túnel SSH afim de proteger meus dados em pontos de acesso wireless públicos. Mas eu queria mais; Não queria ficar pondo e removendo proxy de [...]]]></description>
			<content:encoded><![CDATA[<p>Há muito tempo que eu queria saber um pouco mais sobre os tais túneis SSH.</p>
<p>Depois de procurar um pouco, achei <a href="http://ubuntu.wordpress.com/2006/12/08/ssh-tunnel-socks-proxy-forwarding-secure-browsing/" target="_blank">um artigo</a> que poderia me ajudar a fazer um túnel SSH afim de proteger meus dados em pontos de acesso wireless públicos.</p>
<p>Mas eu queria mais; Não queria ficar pondo e removendo proxy de todas as aplicações só porque mudei de rede. Queria deixar isto transparente.</p>
<p>Depois de perder algumas horas com regras <a href="http://en.wikipedia.org/wiki/Iptables">IPTABLES</a> <a href="http://tips.linux.com/article.pl?sid=06/06/06/200234&amp;tid=100." target="_blank">descobri</a> o <strong><a href="http://tsocks.sourceforge.net" target="_blank">Tsocks</a>, </strong>ou Transparent <a href="http://en.wikipedia.org/wiki/SOCKS" target="_blank">Socks</a> para os íntimos.</p>
<h3>Instalação</h3>
<p>No Ubuntu/Debian como sempre é muito fácil:<br />
<code>apt-get install tsocks</code></p>
<p><sub>Falar de instalação já não tem mais graça&#8230;.<br />
</sub></p>
<h3>Configuração</h3>
<p>Basicamente é necessário editar o arquivo /etc/tsocks.conf. Particularmente, eu limpei este arquivo e coloquei apenas as seguintes linhas:<br />
<code><br />
local = 192.168.0.0/255.255.255.0<br />
path {<br />
reaches = 0.0.0.0/0.0.0.0<br />
server = 127.0.0.1<br />
server_type = 4<br />
server_port = 5151<br />
}<br />
</code><br />
Calma calma, vou explicar:</p>
<p><strong>Local</strong>: é o endereço e a máscara de subrede da rede local. Afina, quando você digitar 192.168.X.X você geralmente deseja acessar a rede interna, correto? Algumas pessoas podem querer utilizar 10.0.0.0/255.0.0.0.</p>
<p>Fora isto, eu quero que <strong>TODA</strong> a conexão feita para <strong>QUALQUER</strong> outro endereço, seja encaminhada para o meu Túnel. Para isto, criei um <strong>path </strong>.</p>
<p><strong>reaches:</strong> Da mesma forma que <strong>Local</strong>, indica o IP da rede para qual eu quero acessar. 0.0.0.0/0.0.0.0 significa aqui toda e qualquer rede (exceto a definida em <strong>Local</strong>).</p>
<p><strong>server</strong> : Indica o endereço IP do servidor Socks. No caso estará em minha máquina local.</p>
<p><strong>server_type</strong>: Indica a versão do servidor Socks.</p>
<p><strong>server_port</strong>: Indica a porta onde o servidor estará rodando. No meu caso, será a porta 5151.</p>
<h3>E agora Rapá?</h3>
<p>E agora precisamos rodar o nosso túnel. O meu fica da seguinte forma:</p>
<p><code> ssh -C -D 5151 MEU_LOGIN@talisker.c3sl.ufpr.br cat -<br />
</code></p>
<p>E depois iniciar o tsocks com o comando:</p>
<p><code>tsocks -on</code></p>
<p>Agora, para rodar o Firefox ou Pidgin utilizando o tsocks, basta dar o seguinte comando:</p>
<p><code>tsocks firefox<br />
tsocks gaim<br />
</code></p>
<p>E está aí, pronto para usar e sem configurações adicionais!</p>
<p>Qualquer dúvida, estamos aí!</p>
<p>[]&#8216;s</p>
<p>Danilo Cesar</p>
<p><span style="font-weight: bold">Update: </span>Desafio para férias: Fazer um port do Tsocks para <a href="http://www.maemo.org" target="_blank">Maemo</a> para usar encriptação nas redes do <a href="http://www.c3sl.ufpr.br">C3sl</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danilocesar.com/blog/2007/05/29/tunel-ssh-com-proxy-socks-agora-em-sabor-transparente/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Você ainda usa a &#8220;tabela admin&#8221;? Você pode estar correndo riscos&#8230;</title>
		<link>http://www.danilocesar.com/blog/2007/04/08/voce-ainda-usa-a-tabela-admin-voce-pode-estar-correndo-riscos/</link>
		<comments>http://www.danilocesar.com/blog/2007/04/08/voce-ainda-usa-a-tabela-admin-voce-pode-estar-correndo-riscos/#comments</comments>
		<pubDate>Sun, 08 Apr 2007 13:10:34 +0000</pubDate>
		<dc:creator>Danilo Cesar</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Segurança]]></category>

		<guid isPermaLink="false">http://www.danilocesar.com/blog/2007/04/08/voce-ainda-usa-a-tabela-admin-voce-pode-estar-correndo-riscos/</guid>
		<description><![CDATA[Creio que seja &#8220;procedimento padrão&#8221; dos programadores PHP, ao desenvolver sistemas de login, criar uma tabela admin com um campo username e outro campo password, e quando o usuário realiza o login, o sistema executa uma query mais ou menos do tipo: $sql = 'SELECT * FROM admin WHERE user=' . $user . ' AND [...]]]></description>
			<content:encoded><![CDATA[<p>Creio que seja &#8220;procedimento padrão&#8221; dos programadores PHP, ao desenvolver sistemas de login, criar uma tabela admin com um campo <em><strong>username</strong></em> e outro campo <em><strong>password</strong></em>, e quando o usuário realiza o login, o sistema executa uma query mais ou menos do tipo:<code> $sql = 'SELECT * FROM admin WHERE user=' . $user . ' AND password = "' .  $password . '"; </code></p>
<p>Claro, pode haver variações de segurança como &#8220;escapestring&#8221; e md5 na senha. Mas a idéia é basicamente esta. Vejamos agora porque eu acho este tipo de procedimento inseguro.</p>
<p>1 &#8211; Todos os &#8220;usuários&#8221; do sistema executam com o mesmo usuário no banco de dados. Como o sistema deve ter um &#8220;super-usuário&#8221; que poderá fazer tudo no sgdb, todos os usuários do sistema poderão fazer tudo. O que quero dizer é que, em qualquer brecha mínima no sistema, um usuário comum (mas mal intencionado) poderá fazer drop em uma tabela inteira.</p>
<p>2 &#8211; A senha do usuário do banco de dados deverá ficar em um arquivo .php legível. Há um tempo atrás, eu utilizava um servidorzinho destes de 9,90 por mês para hospedar meu site. Um dia tive a curiosidade de saber o que tinha no /tmp do servidor. Então fiz uma página que recebia uma string, que se esta fosse um arquivo executava um <em><strong>system(&#8220;cat $valor&#8221;)</strong></em>, e se esta fosse um diretório, executava um <em><strong>system(&#8220;ls -ls $valor&#8221;)</strong></em>. O que eu percebi: Todos os usuários do servidor executavam na web com o mesmo usuário (normalmente o www). Logo o www deverá ter permissão para ler todos os arquivos. Então tive a curiosidade de listar o /home. E depois o /etc/.alias do apache. Indo desta forma, consegui observar o arquivo de configuração de banco de dados de um dos usuários. E depois disto, entrar no php MyAdmin.<br />
Com isto, vocês já imaginam o tamanho potencial da catástrofe né?<br />
Deixei este servidor e migrei para a dreamhost pois após enviar um e-mail alertando os administradores do servidor sobre falha, fui respondido com algo como: &#8220;Estamos cientes, mas você tem alguma dica de como resolver?&#8221;.</p>
<p>Tá tá, realmente a falha 1 pode ser resolvida se você for um programador extremamente observador e não deixar passar absolutamente nada. Sinceramente, acho isto quase impossível. E também se você gostar de re-inventar a roda, re-desenvolvendo todo um sistema de segurança em cima da aplicação, quando poderia ser usado o que &#8220;já vem pronto&#8221; do banco de dados.</p>
<p><strong>Solução: Por a lógica de segurança em cima do banco de dados. Porquê? Porque ela já está implementada e tende a ser mais segura.</strong></p>
<p>Explicação:</p>
<p>A idéia toda é, ao invés de fazer o &#8220;login&#8221; usando seleção você atrela o usuário ao banco de dados. Ao invés de &#8220;criar um usuário&#8221; na tabela admin, você cria um usuário no banco de dados e loga-se com ele. Entendeu?</p>
<p>No PHP ficaria algo assim:</p>
<p><code>mysql_connect($usuario,$senha,$database);</code></p>
<p>Após isto, em banco de dados de verdade (digo PostGress, Oracle e afins), basta você gerenciar as permissões (select, insert, drop´s, etc&#8230;) dos usuário em tabelas específicas. Por exemplo: Não faz sentido um usuário comum ter acesso à tabela de configuração, ou o mesmo poder dar drop em uma tabela qualquer.</p>
<p>Também utilizar Stored Procedures e Views ajudam bastante.  Exige um pouco de conhecimento de DBA, mas deixa sua aplicação mais robusta, além de ser um procedimento muito mais seguro.</p>
<p>Sei que aplicações comerciais de grande porte trabalham desta forma. Mas a grande maioria dos programadores (principalmente web) nunca viram ou trabalharam com este tipo de abordagem. A intenção deste post é apenas dar uma idéia de uma forma diferente, e mais segura, de trabalhar.</p>
<p>Espero que este post incite uma discussão sobre esta e outras abordagem. E você, leitor, como trabalha?</p>
<p>Comentem!</p>
<p>[]&#8216;s e Feliz Páscoa.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danilocesar.com/blog/2007/04/08/voce-ainda-usa-a-tabela-admin-voce-pode-estar-correndo-riscos/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>IP x CEP, como saber de quem é este IP?</title>
		<link>http://www.danilocesar.com/blog/2007/02/15/ip-x-cep-como-localizar-de-quem-e-este-ip/</link>
		<comments>http://www.danilocesar.com/blog/2007/02/15/ip-x-cep-como-localizar-de-quem-e-este-ip/#comments</comments>
		<pubDate>Thu, 15 Feb 2007 18:21:08 +0000</pubDate>
		<dc:creator>Danilo Cesar</dc:creator>
				<category><![CDATA[Segurança]]></category>

		<guid isPermaLink="false">http://www.danilocesar.com/blog/2007/02/15/ip-x-cep-como-saber-de-quem-e-este-ip/</guid>
		<description><![CDATA[Aos administradores de sites: Quantas vezes já não pensamos/precisamos saber em que cidade mora um indivíduo dono de um certo IP? Eu pessoalmente já precisei desta informação muitas vezes, mas infelizmente nunca encontrei um lugar aonde pudesse fazer esta pesquisa. Até hoje! Navegando na internet descobri um site chamado http://www.ipgeo.com.br/, aonde eu dou a ele [...]]]></description>
			<content:encoded><![CDATA[<p>Aos administradores de sites: Quantas vezes já não pensamos/precisamos saber em que cidade mora um indivíduo dono de um certo IP?</p>
<p>Eu pessoalmente já precisei desta informação muitas vezes, mas infelizmente nunca encontrei um lugar aonde pudesse fazer esta pesquisa.</p>
<p><strong>Até hoje!</strong></p>
<p>Navegando na internet descobri um site chamado <a href="http://www.ipgeo.com.br/">http://www.ipgeo.com.br/</a>, aonde eu dou a ele um endereço IP no Brasil e o sistema retorna pra mim, com uma precisão muito grande, a cidade aonde este indivíduo reside.<br />
Também existe a opção de localizar CEP pelo IP, que é um resultado obtido por aproximação, mas também é muito interessante.</p>
<p>O sistema funciona com endereços IP&#8217;s fixos ou dinâmicos. Muito interessante! Vale a pena conferir!</p>
<p>[]&#8216;s</p>
<p>Danilo Cesar</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danilocesar.com/blog/2007/02/15/ip-x-cep-como-localizar-de-quem-e-este-ip/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>O que fazer durante a atualização do seu DNS?</title>
		<link>http://www.danilocesar.com/blog/2006/12/20/o-que-fazer-durante-a-atualizacao-do-seu-dns/</link>
		<comments>http://www.danilocesar.com/blog/2006/12/20/o-que-fazer-durante-a-atualizacao-do-seu-dns/#comments</comments>
		<pubDate>Wed, 20 Dec 2006 14:33:35 +0000</pubDate>
		<dc:creator>Danilo Cesar</dc:creator>
				<category><![CDATA[HTTP]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[Ubuntu-Br]]></category>

		<guid isPermaLink="false">http://www.danilocesar.com/blog/2006/12/20/o-que-fazer-durante-a-atualizacao-do-seu-dns/</guid>
		<description><![CDATA[Olá pessoas, Hoje venho escrever sobre uma idéia que tive para solucionar um certo problema. A algum tempo atrás necessitei trocar um site de um servidor para o outro, mas como este site servia algumas aplicações críticas (é, talvez nem tão críticas), o mesmo não poderia sair em nenhum momento do ar. Ou seja, deveria [...]]]></description>
			<content:encoded><![CDATA[<p>Olá pessoas,</p>
<p>Hoje venho escrever sobre uma idéia que tive para solucionar um certo problema.</p>
<p>A algum tempo atrás necessitei trocar um site de um servidor para o outro, mas como este site servia algumas aplicações críticas (é, talvez nem tão críticas), o mesmo não poderia sair em nenhum momento do ar. Ou seja, deveria estar rodando perfeitamente tanto em um host quanto em outro.</p>
<p>Mas, como testar um sistema em um novo servidor? Substituindo as informações de DNS. Mas, no melhor dos casos demora uma hora. E se der errado? Substitui de volta? São pelo menos 3 horas de um sistema off-line. Acho que não é uma solução interessante para aplicações críticas né?</p>
<h3>Solução inteligente.</h3>
<p>Adicionar nova entrada no /etc/hosts. Simples assim.<br />
Desta forma, você poderá testar sua aplicação no seu novo servidor, e todos os seus clientes continuarão acessando no antigo! Assim, quando você tiver certeza de que tudo está funcionando, você substitui oficialmente o DNS no seu registro de domínios. Legal né?</p>
<h3>Passo a Passo</h3>
<p>1) Primeiro pegue as informações de DNS de seu novo host.<br />
Um exemplo seria o dreamhost: ns1.dreamhost.com</p>
<p>2) Com o comando ping, descubra qual o IP do servidor DNS<br />
<code><br />
$ ping ns1.dreamhost.com<br />
PING ns1.dreamhost.com (66.33.206.206) 56(84) bytes of data.<br />
64 bytes from ns1.dreamhost.com (66.33.206.206): icmp_seq=1 ttl=44 time=233 ms</p>
<p>--- ns1.dreamhost.com ping statistics ---<br />
1 packets transmitted, 1 received, 0% packet loss, time 0ms</p>
<p>rtt min/avg/max/mdev = 233.172/233.172/233.172/0.000 ms<br />
</code><br />
O Ip do servidor aqui é: 66.33.206.206</p>
<p>3) Abra o arquivo /etc/hosts (como root é claro), e adicione a linha<br />
<code><br />
66.33.206.206	seu_site.com.br www.seu_site.com.br<br />
</code></p>
<p>4) Agora, no seu browser acesse o seu_site.com.br, e perceba que você estará acessando no novo servidor, e não mais no oficial.<br />
Agora você pode testar a sua aplicação online, corretamente, sem colocar em risco a continuidade do seu serviço oficial. =)</p>
<p>Qualquer dúvida estamos ae!</p>
<p><em><strong>Acho que esta solução não funciona para quem usa servidores proxy&#8217;s</strong></em></p>
<p>[]&#8216;s<br />
Danilo Cesar</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danilocesar.com/blog/2006/12/20/o-que-fazer-durante-a-atualizacao-do-seu-dns/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ubuntu, wireless e WPA</title>
		<link>http://www.danilocesar.com/blog/2006/11/11/ubuntu-wireless-e-wpa/</link>
		<comments>http://www.danilocesar.com/blog/2006/11/11/ubuntu-wireless-e-wpa/#comments</comments>
		<pubDate>Sat, 11 Nov 2006 07:54:24 +0000</pubDate>
		<dc:creator>Danilo Cesar</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Portáteis]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[Ubuntu-Br]]></category>

		<guid isPermaLink="false">http://www.danilocesar.com/blog/2006/11/11/ubuntu-wireless-e-wpa/</guid>
		<description><![CDATA[Olá, Venho falar hoje um pouco sobre Wireless, WPA e Linux. Como algumas pessoas podem saber, manter uma rede wireless pode ser um problema. Qualquer pessoa na esquina da sua casa ou empresa pode estar tentando &#8220;hackea-la&#8221;. E, diferente do que muita gente pensa, o protocolo WEP não é alias de segurança, pois o mesmo [...]]]></description>
			<content:encoded><![CDATA[<p><img style="float: left" alt="Ubuntu-br" id="image37" src="http://www.danilocesar.com/blog/wp-content/uploads/2006/11/ubuntu.thumbnail.png" /><br />
Olá,</p>
<p>Venho falar hoje um pouco sobre Wireless, WPA e Linux.<br />
Como algumas pessoas podem saber, manter uma rede wireless pode ser um problema. Qualquer pessoa na esquina da sua casa ou empresa pode estar tentando &#8220;hackea-la&#8221;. E, diferente do que muita gente pensa, o protocolo WEP não é <em><strong>alias </strong></em>de segurança, pois o mesmo pode <a target="_blank" href="http://www.guiadohardware.net/tutoriais/121/">ser quebrado com um pouco de conhecimento em menos de uma hora</a>.</p>
<p><strong>Solução: WPA</strong></p>
<p>WPA é um protocolo de segurança criado pela Wireless Aliance para acabar com as enormes falhas de segurança do WEP. E conseguiram (digamos que apenas em partes, pois já saiu o WPA2).</p>
<p>Tudo muito lindo e muito bacana, mas como fazer minha rede rodar com WPA?<br />
Existe um tutorial de como rodar WPA no linux <a target="_blank" href="http://www.ubuntuforums.org/showthread.php?t=263136">neste site</a>, mas é extremamente complexo: roda wpa_suplicant, copia deste conf para este, vai pra cá, vai lá&#8230; copia configuração&#8230;. etc etc etc&#8230;</p>
<p><strong>Maneira Humana:</strong></p>
<p><code lang="bash">apt-get install network-manager-gnome</code></p>
<p>Este programa gera um applet, que ficará em seu systemTray mostrando o sinal da rede. Clicando sobre ele, é possível ver quais as redes disponíveis. Clicando sobre ela, ele tentará autenticar. Caso tenha encriptação, ele pedirá a senha e o tipo de autenticação, sendo esta WEP, WAP ou WPA2. O que facilita extremamente o gerenciamente de redes no Ubuntu.</p>
<p>Lembrem-se: Wireless? Use WPA2 sempre que possível!</p>
<p>Algumas ScreenShots:</p>
<p><img id="image40" alt="Opções" src="http://www.danilocesar.com/blog/wp-content/uploads/2006/11/opcoes_de_encriptacao.png" /><br />
Opções de encriptação disponíveis</p>
<p><img id="image39" alt="Abrindo Wireless" src="http://www.danilocesar.com/blog/wp-content/uploads/2006/11/abrindo.png" /><br />
Redes disponíveis</p>
<p>Para aqueles que tiveram problemas do programa simplismente não localizar rede nenhuma, abra o <strong>network-admin, </strong>vá para conexões wireless, remova todas as informações e reinicie o Ubuntu.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danilocesar.com/blog/2006/11/11/ubuntu-wireless-e-wpa/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>HTTP Headers, HTTP por força bruta&#8230;</title>
		<link>http://www.danilocesar.com/blog/2006/02/19/http-headers-http-por-forca-bruta/</link>
		<comments>http://www.danilocesar.com/blog/2006/02/19/http-headers-http-por-forca-bruta/#comments</comments>
		<pubDate>Sun, 19 Feb 2006 16:50:38 +0000</pubDate>
		<dc:creator>Danilo Cesar</dc:creator>
				<category><![CDATA[HTTP]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Segurança]]></category>

		<guid isPermaLink="false">http://www.danilocesar.com/blog/?p=23</guid>
		<description><![CDATA[Olá pessoal&#8230; Hoje deixei o aiBur Framework de lado para fazer algumas coisas divertidas&#8230; =) Um antigo camarada de programação ASP que está fazendo algumas brincadeiras com linux e SQUID me perguntou esses dias como ele poderia fazer um POST via linha de comando&#8230; Eu que não sabia exatamente o que ele queria indiquei: echo [...]]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal&#8230;</p>
<p>Hoje deixei o aiBur Framework de lado para fazer algumas coisas divertidas&#8230; =)</p>
<p>Um antigo camarada de programação ASP que está fazendo algumas brincadeiras com linux e SQUID me perguntou esses dias como ele poderia fazer um POST via linha de comando&#8230; Eu que não sabia exatamente o que ele queria indiquei:</p>
<p><code lang="bash"><br />
echo "nome=danilo&#038;idade=20" | lynx --post-data http://www.meusite.com.br/meu_post.php<br />
</code><br />
Como muitos devem saber, este comando funciona perfeitamente para enviar POSTs via linha de comando. Mas meu amigo precisava de algo mais &#8220;bruto&#8221;. Ele precisava fazer, por exemplo, POST de um arquivo&#8230; Lá vai o Danilo arranjar uma solução&#8230;</p>
<p>Aqui vou conciliar uma dica que escrevi a muito tempo atrás para o <a href="http://www.vivaolinux.com.br/dicas/verDica.php?codigo=2140">vivaolinux</a>, e a idéia sobre Headers HTTP que vi no <a href="http://brunotorres.net/2005/12/12/o-basico-da-web-introducao-ao-http">BrunoTorres.net.</a></p>
<h3>
Ferramentas que vamos utilizar:<br />
</h3>
<p><a href="http://hpux.cs.utah.edu/hppd/hpux/Networking/Misc/tcputils-0.6.2/">TCPUTILs</a> -> Tcputils é um pacote que contém um conjunto de ferramentas para utilizar sockets diretamente pelo Shell&#8230; Na verdade é um servidor e cliente de echo&#8230; Quase como um telnet. Mas dá pra fazer algumas coisas bacanas com ele, que nós veremos agora&#8230;. =)</p>
<p>HTTP -> Hypertext Transfer Protocol ou Protocolo de transferência de hipertexto: é o formato da comunicação entre o Browser e o servidor. Por exemplo, é o cliente que envia cookies, o servidor que grava sessions, redireciona, etc etc etc&#8230; Seu padrão é definido pela <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html" title="World Wide Web Consortium">W3C</a></p>
<p><a href="http://livehttpheaders.mozdev.org/">LivehttpHeaders Extension</a>: Extenção do Firefox que visualiza todos os headers de uma requisição http.</p>
<p><span id="more-23"></span></p>
<h3>Bom, vamos brincar um pouco:</h3>
<p>Precisamos primeiramente instalar o pacote TCPutil. Como eu uso Debian, é fácil:<br />
<code lang="bash"><br />
apt-get install tcputil<br />
</code></p>
<p>Depois de instalado, virá uma lista de comandos. Iremos usar apenas o tcpconnect. Outros podem ser visto na documentação (man tcpconnect) ou no meu artigo citado acima&#8230;</p>
<p>A descrição do comando é a seguinte:<br />
<code lang="bash">tcpconnect [HOST] [porta]</code></p>
<p>Após a conexão estabilizada, o cliente (no caso, você) poderá enviar suas strings de conexão. No caso, poderá mandar cabeçalhos HTTP para o servidor. Vamos fazer um teste? </p>
<p>tcpconnect danilocesar.com 80</p>
<p>Após a conexão com o servidor, você enviará os seguintes Headers do HTTP:</p>
<p>GET /blog/index.php HTTP/1.1<br />
Host: www.danilocesar.com</p>
<p>Este é, talvez, o cabeçalho mais simples que uma requisição HTTP pode ter. Vamos entende-la:</p>
<p>GET -> É o método de envio de dados<br />
/blog/index.php ->  É a página que eu estou querendo<br />
HTTP/1.2 -> É a versão do protocolo HTTP que estou usando<br />
Host: -> É o Host que você está buscando.</p>
<p>E como respostas você vai ter os Headers vindos do Servidor e o código HTML específico da página.</p>
<p>Agora, nem todos os Headers que estaremos enviando possuem apenas 2 linhas. Para facilitar a nossa vida, colocaremos o cabeçalho HTTP agora em um arquivo texto e iremos enviar os headers assim:</p>
<p>tcpconnect danilocesar.com 80 < headers.txt</p>
<p>Creio que vá facilitar a nossa vida... Bom, vamos continuar.</p>
<p><sub>Meus testes agora vão ser feitos no meu localhost&#8230; Por poder editar melhor os arquivos e tals&#8230;.</sub></p>
<p>Creio que está na hora de enviar-mos alguns Headers mais <strong>&#8220;Pró&#8221;</strong></p>
<p>Se você está com preguiça de ler a documentação do HTTP, podemos visualizar os Headers que o firefox envia utilizando a extenção <a href="http://livehttpheaders.mozdev.org/">LiveHTTPHeaders</a>.</p>
<p>Vamos fazer um teste&#8230;. Com a extensão devidamente instalada, aperte ALT + L, e acesse uma página qualquer. Por exemplo, http://www.google.com.br</p>
<p>Os Headers que enviamos<br />
<code><br />
GET / HTTP/1.1<br />
Host: www.google.com.br<br />
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.1) Gecko/20060209 Debian/1.5.dfsg+1.5.0.1-2 Firefox/1.5.0.1<br />
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5<br />
Accept-Language: pt-br<br />
Accept-Encoding: gzip,deflate<br />
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7<br />
Keep-Alive: 300<br />
Connection: keep-alive<br />
Cookie: KIDYMD=#243194:FBOB#<br />
</code><br />
<em><strong>Cuidado: As propriedades dos headers devem ocupar apenas uma linha cada uma. Toda quebra de linha a mais é feita pelo browser e deve ser discartada</strong></em></p>
<p>Os Headers que recebemos<br />
<code><br />
HTTP/1.x 200 OK<br />
Cache-Control: private<br />
Content-Type: text/html<br />
Content-Encoding: gzip<br />
Server: GWS/2.1<br />
Content-Length: 1556<br />
Date: Sun, 19 Feb 2006 16:25:35 GMT<br />
</code></p>
<p>Se você enviar estes mesmos headers no pelo tcpconnect, talvez você receba apenas algumas Strings estranhas, pois a informação vem toda compactada do Servidor pelo gzip. Para ver as informações inteiras, retire a linha &#8220;Accept-Encoding: gzip,deflate &#8221; do seu header.</p>
<p>Agora, dentro do seu LiveHTTPHeaders, dê um Clean, volte ao google e busque por HTTP:<br />
Temos agora 2 diferenças nos Headers.<br />
<code><br />
GET /search?hl=pt-BR&#038;q=HTTP+Headers&#038;btnG=Pesquisa+Google&#038;meta= HTTP/1.1</p>
<p>Referer: http://www.google.com.br/<br />
</code></p>
<p>O get agora está bem mais incrementado certo? Ele contém as Strings de busca do google.<br />
Um novo Header foi enviado pelo browser: Referer. Ele indica o caminho completo da página de onde você veio. Isto é muito utilizado para quebrar spammers de blog (método bem inseguro, mas quebra boa parte dos spammers), para estatisticas (quais sites possuem links para o seu).</p>
<h3>E os prometidos arquivos?</h3>
<p>Vamos agora aprender a enviar arquivos. Na verdade, não muda muita coisa.</p>
<p><code><br />
POST /obj/teste.php HTTP/1.1<br />
Host: localhost<br />
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.1) Gecko/20060209 Debian/1.5.dfsg+1.5.0.1-2 Firefox/1.5.0.1<br />
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5<br />
Accept-Language: pt-br<br />
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7<br />
Keep-Alive: 300<br />
Connection: keep-alive<br />
Referer: http://localhost/obj/teste.php<br />
Content-Type: multipart/form-data; boundary=--BoRdEr_Signature-00253658974569--<br />
Content-Length: 700</p>
<p>----BoRdEr_Signature-00253658974569--<br />
Content-Disposition: form-data; name="teste"; filename="source.list"<br />
Content-Type: text/plain</p>
<p>#deb cdrom:[Debian GNU/Linux testing _Etch_ - Official Snapshot i386 Binary-1 (20051212)]/ etch contrib main</p>
<p>#deb cdrom:[Debian GNU/Linux testing _Etch_ - Official Snapshot i386 Binary-1 (20051212)]/ etch contrib main</p>
<p>#deb file:/ apt/</p>
<p>#deb http://security.debian.org/ testing/updates main contrib<br />
deb http://security.debian.org/ etch/updates main contrib non-free</p>
<p>#deb http://ftp.debian.org/debian/ unstable main<br />
#deb-src http://ftp.pucpr.br/debian/ testing main</p>
<p>deb http://ftp.debian.org/debian/ testing main<br />
deb-src http://ftp.debian.org/debian/ testing main</p>
<p>----BoRdEr_Signature-00253658974569----</p>
<p></code></p>
<p>No caso, estou mandando o meu arquivo Source.list Vamos às descrições:<br />
<strong>Content-Type: multipart/form-data;</strong> &#8211; Indica o tipo do conteúdo<br />
<strong>boundary=&#8211;BoRdEr_Signature-00253658974569&#8211;</strong> Indica o separador de conteúdo.<br />
<strong>Content-Length: 700</strong> &#8211; Tamanho do seu arquivo.<br />
A parte de dentro seria o seu arquivo propriamente dito&#8230;<br />
<strong>Content-Type: text/plain</strong> &#8211; Tipo do conteúdo. No caso, texto plano, mas poderia ser uma imagem, um executável, etc et.</p>
<p>Da mesma forma, o código acima funciona com imagens, mas não mostro aqui com imagens pois seria inútil, pois provavelmente viria encriptada&#8230;</p>
<p>Bom, e termina aqui a descrição do problema e da solução.<br />
Caso tenha problemas, ou sugestõe, comente abaixo.</p>
<p>[]s!</p>
<p><sub><strong><em style="color: #FF0000;">O tcpconnect tem um número máximo de caracteres de resposta. Isso pode dar algum problema com Headers muito grandes</em></strong></sub></p>
]]></content:encoded>
			<wfw:commentRss>http://www.danilocesar.com/blog/2006/02/19/http-headers-http-por-forca-bruta/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Injection&#8230; Estou realmente seguro?</title>
		<link>http://www.danilocesar.com/blog/2006/01/13/sql-injection-estou-realmente-seguro-php/</link>
		<comments>http://www.danilocesar.com/blog/2006/01/13/sql-injection-estou-realmente-seguro-php/#comments</comments>
		<pubDate>Fri, 13 Jan 2006 20:55:03 +0000</pubDate>
		<dc:creator>Danilo Cesar</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Segurança]]></category>

		<guid isPermaLink="false">http://www.danilocesar.com/blog/?p=16</guid>
		<description><![CDATA[Olá, Bom, neste segundo artigo aqui venho falar um pouco sobre segurança em sistemas PHP. Creio que muitos acham que este é um assunto batido: Também acho! Mas, depois de verificar alguns sistemas em PHP começei a perceber alguns &#8220;istupros&#8221; à segurança na internet&#8230; Injection Básico Caso você seja um programador experiênte, diriga-se à próxima [...]]]></description>
			<content:encoded><![CDATA[<p>Olá,</p>
<p>Bom, neste segundo artigo aqui venho falar um pouco sobre segurança em sistemas PHP.</p>
<p>Creio que muitos acham que este é um assunto batido: Também acho!<br />
Mas, depois de verificar alguns sistemas em PHP começei a perceber alguns &#8220;istupros&#8221; à segurança na internet&#8230;</p>
<p><span id="more-16"></span></p>
<h2>Injection Básico</h2>
<p><sub>Caso você seja um programador experiênte, diriga-se à próxima seção. Ou leia esta apenas por diversão =)</sub><br />
<code lang="php"><br />
< ?<br />
$user = $_POST["usuario"];<br />
$senha = $_POST["senha"];<br />
$sql = "SELECT * FROM users WHERE user='" . $user ."' AND senha='" . $senha . "'";<br />
$result = mysql_query($sql,$cox);<br />
?><br />
</code></p>
<p>Temos ai em cima um exemplo de um site &#8220;<strong>exploitável</strong>&#8221; via SQL Injection.</p>
<p>Como a maioria dos programadores deve saber, qualquer &#8220;<strong><em>piá de prédio</em></strong>&#8221; que se preze iria colocar, por exemplo no campo usuário o valor <em><strong>1&#8242; OR 1=&#8217;1</strong></em> ou o clássico <em><strong>admin&#8217;#</strong></em>.<br />
Desta forma o SQL ficaria assim:</p>
<p><code lang="php"><br />
$sql = "SELECT * FROM users WHERE user='1' OR 1='1' AND senha=''xxxxxxxx";<br />
OU<br />
$sql = "SELECT * FROM users WHERE user='admin'#' AND senha=''xxxxxxxx";<br />
</code><br />
Isso retornaria um usuário qualquer no banco de dados, e o segundo caso, o usuário malicioso (vulgo: <strong><em>piá de prédio</em></strong>) teria acesso ao usuário admin&#8230;.</p>
<p>Mas como todos sabem, podemos facilmente evitar esses problemas tratando as variáveis com mysql_escape_string(), que substitui caracteres perigosos por \Caracteres, evitando SQL injtections.</p>
<h2>Escape String Mania!!!</h2>
<p>Depois de certo tempo, vários administradores de sistemas começaram à usar os tais &#8220;escapes strings&#8221;, addslashes ou soluções semelhantes&#8230;.</p>
<p>Ai, em tudo quanto é lugar começaram à utilizar os tais escapes strings, onde precisa e as vezes onde não precisava. E se achavam super seguros..</p>
<p>Analizando códigos, começei a notar os seguintes vícios:<br />
<em><strong>&#8220;Tudo o que eu recebo e coloco em um SQL eu preciso dar escape. Ai sim estarei seguro!&#8221;</strong></em><br />
Não é bem assim&#8230;. Por exemplo no código abaixo:</p>
<p>Quero selecionar todas as entradas da minha agenda de uma determinada classe &#8220;&#8221;<br />
<code lang="php"><br />
$class = mysql_escape_string($_GET['class']);<br />
$sql = 'SELECT * FROM agenda WHERE class=' . $class . ' AND user=' . $_SESSION['user'];<br />
</code></p>
<p>Você, leitor deste blog, programador PHP, diria que isto é um SQL &#8220;seguro&#8221;?<br />
Regra número 2: Nunca confie no que vem do cliente.</p>
<p>Utilizando de um código como este, o usuário poderia simplismente digitar na barra de endereços:</p>
<p>http://www.meusiteinseguro.com.br/pagina.php?class=10%20OR%201</p>
<p>Resultando no seguinte SQL:<br />
<strong>SELECT * FROM agenda WHERE class=10 OR 1 AND user=250</strong><br />
O que resultaria numa cáca danada pro sistema, abrindo todos os dados da agenda, de todos os usuários&#8230;<br />
Isso falando apenas de SELECTs. O problema seria muito maior se tratando de updates e deletes.</p>
<p>Na verdade esse é apenas um problema de mal uso de escape_string.<br />
Não basta apenas utiliza-las para verificar um possível injection. O problema seria resolvido formatando os dados usanod, por exemplo, a fução intval(): que pega apenas números inteiros de uma string.</p>
<p>Verifique se você não cometeu, ou está cometendo esses erros&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danilocesar.com/blog/2006/01/13/sql-injection-estou-realmente-seguro-php/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

