1. INTRODUÇÃO
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 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 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 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 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), sendo que 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 por exemplo:
http://www.exemplo.com.br/info.php?cod=7&nome=Rafael
echo $cod; // Irá imprimir na tela 7 echo $nome; // Irá imprimir na tela Rafael ?>
O problema está no fato que variáveis podem ser injetadas via url explorando o método GET. No código descrito abaixo para validação de usuário possui esse erro de segurança na programação.if(Autenticar($usuario, $senha)) { $permissao = 1; } if($permissao == 1) { include("admin.php"); } ?>
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, $senha)) { $permissao = 1; } else { $permissao = 0; } if($permissao == 1) { include("admin.php"); } ?>
Desta maneira, 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 dando-nos a certeza sobre quais variáveis estão vindo do GET, POST, etc e quais não estão.
Uma correção para problema já descrito mantendo a mesma lógica e utilizando superglobais seria:
if(Autenticar($_POST['usuario'], $_POST['senha'])) {
$permissao = 1;
}
if($_SERVER['permissao'] == 1) {
include("admin.php");
} ?>
Para maiores informações sobre a função de cada superglobal acesse: http://www.php.net/manual/pt_BR/language.variables.predefined.phpRafael Leandro Junior - http://www.plugmasters.com.br/sys/materias/499/1/Seguran%E7a-em-PHP:-Desenvolvendo-c%F3digos-seguros.

Nenhum comentário:
Postar um comentário