Se estão agora a iniciar-se com o PHP, a segurança pode não ser um factor importante para se focarem agora. Infelizmente, esta é a razão pela qual o PHP tem má reputação quando se fala em segurança. É tão fácil começar a programar em PHP que a maioria das pessoas escreve código sem nunca se preocupar com a segurança. Neste artigo vamos ver algumas questões de segurança quando trabalhamos os dados de um formulário.

php_logo

Existe uma regra que devem ter sempre em mente quando trabalham dados vindos de desconhecidos: nunca confiem nos mesmos! Se têm um formulário onde os utilizadores podem inserir dados, não os considerem na totalidade. Devem validar os dados antes de os utilizarem! O problema de segurança mais comum é a chamada injecção de SQL, em que o visitante mal intencionado injecta código SQL nas queries à base de dados, permitindo-lhes, por exemplo apagar tabelas. A forma mais comum de o conseguirem é através de uma query string (o endereço da página) ou através do formulário.

Mais à frente iremos ver quão perigosas podem ser as injecções de SQL, mas por agora vamos ver o perigo de confiar em demasia nos dados que o utilizador envia nos formulários. Vejam o seguinte exemplo:

Esta é uma versão simplificada de um sistema de avaliação. Provavelmente já devem ter visto algo do género em vários sites. Nestes casos, a avaliação é guardada na base de dados, e quando é mostrada a avaliação global, o script soma todas as avaliações dividindo depois pelo número de avaliações. É muito simples, e se correrem este script, podem pensar que é totalmente seguro, uma vez que o utilizador apenas escolhe um valor da lista de opções. Usamos o método POST, por isso o utilizador não pode enviar qualquer outro valor na query string. Por isso, é seguro, certo?

Não, nem por isso! Enviar dados com o método POST para uma página é apenas um pouco mais difícil de manipular a query string do que com o método GET. Se guardaram o exemplo anterior num ficheiro, criem um novo ficheiro com este novo exemplo:

Alterem o valor action de outroficheiro.php para o nome do ficheiro do primeiro exemplo, e abram este novo ficheiro no browser. O formulário é ligeiramente diferente, mas usa exactamente os mesmos campos. Se clicarem no botão Enviar, o valor será enviado para outroficheiro.php e é tratado como se viesse da lista de escolha, sem mais perguntas! Neste caso, se enviarmos uma avaliação de 1000 em vez de 5 para a base de dados, a avaliação global irá ser completamente errada. Este é um pequeno problema comparado com o que se pode fazer quando os formulários não são validados. Por exemplo, o utilizador pode enviar uma string SQL em vez de um número, e quando pensamos que estamos a escrever um número na base de dados, na realidade está a ser executado o código malicioso SQL que o utilizador enviou.

Neste caso, é bastante simples validar os dados que são enviados. Alterem o código PHP do primeiro exemplo para algo deste género:

 

Adicionámos aqui 3 simples verificações:

Verificamos se o valor passado é mesmo um número com a função is_numeric(). Basicamente diz-nos se o parâmetro passado é um número ou se é uma string que pode ser convertido directamente para um número. De seguida verificamos se o número é maior que 0 (zero) e por último se o número é menor que 6, o que nos limita aos valores possíveis de 1 a 5.

Desta forma acabámos de garantir a segurança do formulário. Sempre que usamos informação fornecida pelos utilizadores devemos sempre ter em atenção em validar correctamente os dados antes de os usarmos. Por vezes com uma simples validação dos dados evitamos problemas que nem nos passa pela cabeça, por isso, não confiem nunca nos dados enviados nos formulários, validem sempre os dados dos formulários antes de os usarem!

Tiago Ramalho

Tiago Ramalho é um profissional de Informática interessado em Internet, Programação .NET e PHP e blogging. Nos tempos livres escreve nos interessespessoais.com sobre Jardim, Saúde, Sistemas, utilitários e outros temas relacionados com informática.

More Posts - Website - Twitter - Pinterest - Google Plus