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 GenilhuVamos 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.