Desenvolvimento - PHP

PHP: Programando com segurança

Este documento tem com ênfase a programação com o mínimo de segurança aceitável para um sistema.

por Leo Genilhu



Este documento tem com ênfase a programação com o mínimo de segurança aceitável para um sistema. Quando falamos de segurança temos que ter noção que um projeto já deve nascer com esta preocupação. Que os programadores deste projeto também tenha esta preocupação na construção do código. Ou seja segurança não é apenas um "coisa" de rede ou de administrador de sistema, mais também uma "coisa" de programador.

Vamos ver aqui alguns exemplos simples de códigos inseguros que podem comprometer todo um sistema.

1) (Cross site script) regra Numero um, nunca passe dados importantes via GET

Exemplo. Uma pagina que usa templates onde o link para o template é passado via GET.
http://exemplo.com.br/exemplo.php?link=faleconosco.html

Isto poderia gerar um grande transtorno pois a pessoa poderia passar qualquer endereço acima, o que poderia fazer por exemplo, que esta pagina funcionaria como um site pornô.

2) (tratamento de dados) regra numero dois, sempre que passar um dado via GET tratar esse dado usando REGEX ou qualquer tipo de mascara, para ter certeza do tipo de dado recebido.

http://exemplo.com.br/exemplo.php?cod=123
$cod = int($_GET["cod"]); 
//isto já transformaria qualquer dado para inteiro

3) (Sql injection) Esta regra é comumente usada por programadores desatentos. Nunca passe dados de um formulário direto para um query. Exemplo:

Código html
<input type=text name=login>
<input type=password name=senha>

código php
<?php
$sql = "SELECT * FROM users WHERE user=$login AND pass=$senha";
?>

Ou seja as variáveis $login e $senha chegam direto no banco de dados sem nenhum tratamento ou o que pode acontecer.

Se o usuário digitar no login ou na senha OR "1=1", ou seja,

$user = a nada OR 1=1 -->passou
$senha = a nada OR 1=1 -->passou

e pode-se fazer muito mais....

Uma simples validação de senha e login evitaria isso, sendo este tipo de invasão muito comum e de responsabilidade do programador não do servidor de hospedagem.

4) (tipo de dados) Quarta regra: Sempre verificar e indicar a origem da variavel.

Exemplo:

$cod  = $_GET["cod"] //tipo get
$cod  = $_POST["cod"] //tipo post
$cod  = $_SESSION["cod"] //tipo session
$cod  = $_COOKIE["cod"] //tipo cookie

já que por padrão as versões superiores a 4.2 trazem a variável global desabilitada

5) restrição de html htmlspecialchars.

Exemplo: um formulário padrão com campos abertos como de observação onde o usuário poderia colocar no lugar de simples texto um código html comum, um link de foto ou até um javascript malicioso.

Para impedir isso existe um tratamento importante com a função htmlspecialchars() (ver documentação do php) que transforma códigos html em simples códigos texto.

Obs. Teremos uma classe de validação de formulários com um método com esta função seu uso será descrito na documentação da classe.

6) Gravar arquivos via upload. Sempre que for gravar um arquivo via upload tenha certeza do tipo de arquivo que está gravando. Por exemplo um arquivo de imagem pode ser simplesmente tratado usando uma validacão de tipos.

Exemplo:

function type_up()
   {//Verifica se o mime-type do arquivo de imagem 
     if(!eregi("^image\/(pjpeg|jpeg|png|gif|bmp)$", $this->arquivo["type"])){ 
       return 0;
     }else{
       return 1;
     }
   }

Obs: também teremos uma classe sobre upload que teria um metodo de tratamento de tipos com sua documentação de uso.

Com isso não seria gravado outro tipo de arquivo que não uma imagem.

Poderíamos citar N outros casos de invasão ou insegura de um sistema. Por isso acredito que esta documentação estará sempre aberta. Porém o mais importante é ter a consciência de projetarmos desde o inicio o sistema pensado sempre na responsabilidade de termos SEGURANÇA.

Leo Genilhu

Leo Genilhu - Atua como consultor de desenvolvimentos e aplicações em web/wireless, sendo analista de uma empresa de desenvolvimento.
Além disso participa de comunidades de linux e software livre. Mantedor de lista de discussão em php e linux.