Este artigo tem como principal objetivo demonstrar ao leitor a real necessidade de incutir segurança em projetos de software. O uso dessa gestão da tecnologia é eficaz para se assegurar a obtenção de um produto seguro de possíveis invasões aos dados do software como um todo. Tais táticas foram criadas de forma a suprir a cada vez maior necessidade de atender a todos os diversos ciclos de vida de um software, e hoje representam um ponto vital da arquitetura e manutenibilidade dos sistemas.
O PHP é uma linguagem de programação de fácil aprendizado, interativa e dinâmica que nasceu com o objetivo de abraçar o desenvolvimento web. Além disso, possui forte integração com outras ferramentas de código aberto, como o banco de dados MySQL, o servidor web Apache, entre outras. Um dos principais motivos pelos quais sites desenvolvidos em PHP são alvos de ataques frequentes são as aberturas e recursos da linguagem que permitem a desenvolvedores menos experientes criar códigos inseguros e deixar grandes brechas na aplicação, levando a perigosas inconsistências. Aliado a isso, a grande popularidade da linguagem entre os desenvolvedores na hora de escolher as tecnologias que usarão para construir seus sistemas leva, consequentemente, a mais pessoas criando códigos inseguros.
Por esses e outros motivos, o PHP é bastante vulnerável a práticas maliciosas, conforme veremos mais adiante. Dessa forma, para tornar o PHP mais seguro, ao longo do artigo serão apresentadas algumas dicas e boas práticas de segurança comuns e eficientes, que podem, inclusive, cooperar entre si para tornar os sites ainda mais seguros.
Entendendo o PHP e suas diversas características
É importante saber que o PHP tem muitas características únicas que o tornam muito adequado para o desenvolvimento web. Tarefas comuns de programação que seriam complicadas em outras linguagens são demasiadamente mais fáceis em PHP, o que gera tanto vantagens quanto desvantagens. Uma característica em particular tem atraído mais atenção do que qualquer outra, a register_globals.
Se você já escreveu aplicações CGI em C em seus primeiros dias de desenvolvimento web, provavelmente saberá quão tedioso o processamento de formulários pode ser. No universo do PHP, as diretivas dos register_globals, por exemplo, quando ativadas, reduzem automaticamente a complexidade na conversão dos dados de formulário, ao assegurar que para cada campo do mesmo teremos variáveis globais em nosso script PHP acessíveis pelo nome do campo precedido do caractere $. Isso faz com que escrever aplicações PHP seja muito fácil e conveniente, mas também representa um enorme risco de segurança.
Na verdade, o register_globals é injustamente difamado. Sozinho, ele não cria vulnerabilidades de segurança — o desenvolvedor deve cometer erros para tal. No entanto, pode-se citar duas principais razões pelas quais você deveria considerar desenvolver e implementar aplicações com o register_globals desativado:
- Pode aumentar a magnitude de uma vulnerabilidade de segurança;
- Pode esconder a origem dos dados, conflitando com a responsabilidade de um desenvolvedor manter o controle de dados em todos os momentos.
Para tanto, presumiremos que o register_globals estará desativado para o âmbito deste artigo. Em vez disso, usaremos arrays superglobais, como $_GET e $_POST, uma vez que seu uso é quase tão conveniente quanto depender de register_globals, e a ligeira falta de conveniência vale a pena em função do aumento da segurança.
Relatório de erros
Todo desenvolvedor comete erros, e os recursos de report de erros do PHP podem ajudar a identificar e localizar tais erros. No entanto, o nível de detalhamento que o PHP fornece em relação às informações que o mesmo manipula pode ser o suficiente para um atacante malicioso, e isso é certamente indesejável. É importante certificar-se de que informações que comprometam a segurança nunca sejam exibidas ao público em geral, o que pode ser alcançado de forma tão simples quanto a configuração do display_errors para o valor OFF. Claro, você quer ser notificado dos erros, então é interessante definir o log_errors com o valor ON, indicando o local (diretório) onde se deseja salvar o log via variável error_log.
A função padrão do PHP para a configuração do seu nível de report de erros é a error_reporting(), que recebe a constante referente ao nível de log
a ser reportado. Se o seu nível de report de erros não estiver configurado adequadamente, poderemos ter alguns erros camuflados pelo PHP. Caso deseje logar apenas mensagens de
erro, especificamente, poderá usar error_reporting(E_ERROR), já para as mensagens de e ...