Segurança em PHP: Desenvolvendo códigos seguros
Autor: Brunielle | Publicado: 2010-04-22T12:17:00-07:00


1. INTRODUÇÃO
&nbsp; 
O PHP (PHP: Hypertext Preprocessor)  é uma linguagem de script Open Source de uso geral, muito utilizada e  especialmente guarnecida para o desenvolvimento de aplicações Web  embútivel dentro do HTML [PHP.net 2006]. Por ser uma linguagem poderosa e  relativamente de fácil compreensão torna-se um fator positivo para as  pessoas que desejam aprender a programar, porém se torna um problema já  que poucos se importam em aprender algo sobre segurança e acabam  escrevendo seus códigos bastante frágeis. Isso infelizmente não acontece  somente com PHP. 

Muitos iniciantes em programação por falta de  informação necessária acabam escrevendo seus códigos com falhas, algumas  banais. Em algumas linguagens isso não é um problema grave, porém toda   <a href="http://www.plugmasters.com.br/sys/materias/499/1/Seguran%E7a-em-PHP:-Desenvolvendo-c%F3digos-seguros.#" onclick="hwClick2418915(undefined);return false;" oncontextmenu="return false;" onmouseout="hideMaybe('HOTWordsTitle'); this.style.cursor='hand'; 
this.style.textDecoration='underline'; this.style.borderBottom='dotted 
1px'; " onmouseover="hw2418915(event, this, 'undefined'); 
this.style.cursor='hand'; this.style.textDecoration='underline'; 
this.style.borderBottom='solid';" style="border-bottom: 1px dotted; color: red; text-decoration: underline;">tecnologia que é voltado para  Web torna-se bastante propicia a ataques já que fica em contato com  diversas pessoas diferentes no mundo inteiro. 

É importante  lembrar que servidores "bem configurados" não fazem por si só um  <a href="http://www.plugmasters.com.br/sys/materias/499/1/Seguran%E7a-em-PHP:-Desenvolvendo-c%F3digos-seguros.#" onclick="hwClick3418915(undefined);return false;" oncontextmenu="return false;" onmouseout="hideMaybe('HOTWordsTitle'); this.style.cursor='hand'; 
this.style.textDecoration='underline'; this.style.borderBottom='dotted 
1px'; " onmouseover="hw3418915(event, this, 'undefined'); 
this.style.cursor='hand'; this.style.textDecoration='underline'; 
this.style.borderBottom='solid';" style="border-bottom: 1px dotted; color: red; text-decoration: underline;">sistema seguro, em outras  palavras, a programação do sistema é fator fundamental quando se fala em  segurança.
Um grande número de sites pequenos e provavelmente muitos  sites grandes rodam códigos pessoais escritos por alguns que não  possuem uma experiência necessária com PHP ou em programação segura,  isso também significa que um grande número de sites podem se tornar ou  estão inseguros. 


2. CONSIDERAÇÕES GERAIS
De acordo com&nbsp;o [Manual PHP.net 2006] um sistema  completamente seguro é virtualmente impossível de se conseguir, então  uma abordagem freqüentemente usada em segurança é um compromisso entre  risco e usabilidade. Se cada variável enviada pelo usuário utilizar duas  formas de validação biométrica (como escaneamento de  <a href="http://www.plugmasters.com.br/sys/materias/499/1/Seguran%E7a-em-PHP:-Desenvolvendo-c%F3digos-seguros.#" onclick="hwClick1418915(undefined);return false;" oncontextmenu="return false;" onmouseout="hideMaybe('HOTWordsTitle'); this.style.cursor='hand'; 
this.style.textDecoration='underline'; this.style.borderBottom='dotted 
1px'; " onmouseover="hw1418915(event, this, 'undefined'); 
this.style.cursor='hand'; this.style.textDecoration='underline'; 
this.style.borderBottom='solid';" style="border-bottom: 1px dotted; color: red; text-decoration: underline;">retina e impressão digital),  teríamos um nível de checagem extremamente alto. Demoraria um tempo  razoável para preencher um formulário, o que incentivaria os usuários a  achar maneiras de burlar a segurança.
Quando estiver testando, tenha em mente que você não  será capaz de testar todas as possibilidades nem mesmo para as páginas  mais simples. A entrada que você pode esperar será totalmente diferente  da entrada dada por um empregado irritado, um cracker com meses livres  para tentar quebrar o sistema, ou um gato andando pelo teclado. Por isso  é melhor olhar o código da perspectiva lógica, para discernir onde  dados inesperados podem ser introduzidos, e depois seguir aonde o mesmo é  modificado, reduzido ou amplificado.
A Internet está cheia de gente tentando fazer o próprio  nome quebrando o código dos outros, derrubando sites, enviando conteúdo  indevido e de outras formas fazendo seu dia interessante. Não importa se  você tem um site grande ou pequeno, você é um alvo simplesmente por  estar on-line, tendo um servidor que pode ser conectado. Muitos  programas de cracking não discernem por tamanho, eles simplesmente  vasculham blocos gigantes de IPs procurando por vítimas. Tente não se  tornar uma.

3. FALHAS DE SEGURANÇA
3.1 Register Globals
O  Register_Globals é uma diretiva de configuração do arquivo php.ini e tem  como finalidade definir se o servidor deve ou não  registrar quaisquer variáveis como globais.
Até a  versão 4.2.0 do PHP a diretiva Register_Globals era por padrão ON  (ativada), ou seja, até essa versão toda variável tratada no ambiente  era setada como variável global por padrão. Porém, a partir da versão  4.2.0 o padrão mudou para OFF (desativada),&nbsp;sendo que&nbsp;muitos servidores  mesmo utilizando versões mais recentes alteram essa diretiva para ON  pois muitos scripts antigos foram feitos com base no  Register_Globals=ON, sendo assim esses scripts não iriam funcionar  quando o padrão for OFF a menos que sejam revisados.

Quando o  Register_Globals está ativado (ON) as variáveis enviadas a um script PHP  provindas dos métodos GET, POST, entre outros, se tornam variáveis  globais como&nbsp;por&nbsp;exemplo:

http://www.exemplo.com.br/info.php?cod=7&amp;nome=Rafael

echo&nbsp;$cod;&nbsp;//&nbsp;Irá imprimir na  tela 7 
echo&nbsp;$nome;&nbsp;//&nbsp;Irá imprimir na  tela Rafael 
?&gt;
O  problema está no fato que variáveis podem ser injetadas via url  explorando o método GET.&nbsp;No código&nbsp;descrito abaixo para validação de  usuário possui&nbsp;esse erro de segurança na programação.


if(Autenticar($usuario,&nbsp;$senha))&nbsp;{ 
&nbsp;&nbsp;&nbsp;&nbsp;$permissao&nbsp;=&nbsp;1; 
} 
if($permissao&nbsp;==&nbsp;1)&nbsp;{ 
&nbsp;&nbsp;&nbsp;&nbsp;include("admin.php"); 
} ?&gt;
Sendo  assim, se algum usuário chamar a url desta maneira: http://www.exemplo.com.br/info.php?permissao=1  o script iria chamar a função “Autenticar” mas não importará se o  usuário foi autenticado ou não pois será atribuido à variável $permissao  via url, logo quando o script fizer a verificação para incluir o  arquivo admin.php a mesma será satisfatória, sendo assim, um usuário que  na realidade não possui permissão consegue acesso à página restrita.

O  problema poderia ser facilmente corrigido com a sintaxe abaixo:


if(Autenticar($usuario,&nbsp;$senha))&nbsp;{ 
&nbsp;&nbsp;&nbsp;&nbsp;$permissao&nbsp;=&nbsp;1; 
}&nbsp;else&nbsp;{&nbsp;
&nbsp;&nbsp;$permissao&nbsp;=&nbsp;0; 
} if($permissao&nbsp;==&nbsp;1)&nbsp;{ 
&nbsp;&nbsp;&nbsp;&nbsp;include("admin.php"); 
} ?&gt;
Desta  maneira, &nbsp;mesmo que a variável $permissao fosse  injetada via url, ela se tornaria 0. 

Com  Register_Globals=OFF as variáveis que são passadas como parâmetro via  url não se tornam variáveis globais. A maneira correta de utilizar é  simplesmente fazer uso de arrays superglobais que são $_GET, $_POST,  $_SERVER, etc. 

A utilização de superglobais sempre é preferida  por razões de segurança&nbsp;dando-nos a certeza sobre&nbsp;quais variáveis estão  vindo do GET, POST, etc&nbsp;e quais não estão.

Uma correção&nbsp;para  problema já descrito mantendo a mesma lógica e utilizando superglobais  seria:

if(Autenticar($_POST['usuario'],&nbsp;$_POST['senha']))&nbsp;{ 
&nbsp;&nbsp;&nbsp;&nbsp;$permissao&nbsp;=&nbsp;1; 
} 
if($_SERVER['permissao']&nbsp;==&nbsp;1)&nbsp;{ 
&nbsp;&nbsp;&nbsp;&nbsp;include("admin.php"); 
} ?&gt;
Para&nbsp;maiores  informações&nbsp;sobre a função de cada superglobal acesse: http://www.php.net/manual/pt_BR/language.variables.predefined.php


Rafael Leandro Junior - http://www.plugmasters.com.br/sys/materias/499/1/Seguran%E7a-em-PHP:-Desenvolvendo-c%F3digos-seguros.