Desenvolvimento - PHP

Desenvolvimento seguro com PHP

Neste artigo iremos aprender alguns cuidados que devemos tomar ao criar nossas aplicações web, evitando assim uma boa quantidade de ataques à sua aplicação.

por Hiago Hubert



É com enorme satisfação que escrevo esse meu primeiro artigo para o Linha de código, sobre um assunto tão importante nos ultimos tempos onde o que mais se vê nas midias é noticia de sites sendo invadidos.

Muitos desses ataques são por erros bem comuns cometidos por programadores, no nosso caso, programadores PHP, nesse artigo pretendo falar sobre algumas precauções a se tomar durante o desenvolvimento de sua aplicação web para evitar grande parte dos ataques.

Configurar o PHP.ini

Primeiramente, devemos atentar para as configurações oferecidas pelo PHP para tornar nosso aplicativo mais seguro. Não vou falar sobre a diretiva safe_mode e nem das que derivam desta pois esta está obsoleta.

  • disable_functions=string
  • Com essa diretiva, você pode desabilita funções especificas do php que podem gerar problemas de segurança, como por exemplo o fopen(),popen() e file(). Dessa forma: disable_functions=fopen,popen,file;

  • disable_errors=On|Off
  • Deixe essa função habilitada só se estiver em ambiente de desenvolvimento, já que é indispensável saber detalhes sobres os erros de sua aplicação, mas quando for passar sua aplicação para ambiente de produção deve desabilitar essa diretiva, e usar métodos alternativos para saber de erros gerados pela aplicação (salvar os erros em um arquivo de log);

  • doc_root=string
  • Essa diretiva pode ser configurada com um caminho que especifica o diretório raiz a partir do qual os arquivos PHP serão servidos. Se a diretiva doc_root estiver configurada com nada (vazia), ela será ignorada, e os scripts PHP serão executados exatamente conforme especifica a URL;

  • open_basedir=string
  • A diretiva open_basedir do PHP pode estabelecer um diretório base ao qual todas as operações com arquivos estarão restritas. Suponha que seu site esteja localizado na pasta home/www , para impedir que pessoas má intencionadas manipulem arquivos , tais como /etc/passwd por meio de alguns comandos simples do proprio PHP, você deve configurar essa diretiva da seguinte forma: open_basedir = “/home/www/”.

  • expose_php=On|Off
  • É conveniente desabilitar essa opção, pois ela exibe detalhes sobre o PHP na assinatura do servidor.

Configurando o Apache

  • ServerSignature
  • Esta diretiva é responsavel por gerar a assinatura do servidor, mostrando a versão do servidor Apache, o nome do servidor, à porta e aos módulos compilados. É aconselhável mantê-la desabilitada.

  • ServerToken
  • Se a ServerSignature estiver habilitada, essa irá configurar o grau de detalhes sobre o servidor que será fornecido, estão disponiveis seis opções: Full, Major, Minimal, Minor, OS e Prod.

phpinfo()

Frequentemente programadores inexperientes deixam que alguma arquivo php com referencia a essa função vá ao modo de produção do site, o que é muito perigoso, pois como sabemos o phpinfo() exibe detalhes de como seu php está configurado e isso é muito interessante para hackers. Portanto, sempre que for colocar a sua aplicação web em modo de produção certifique-se que não há nenhuma chamada esta função.

Se você duvida do quanto esse erro é comum, coloque o seguinte texto na busca do google: inurl:phpinfo.php . Tenho certeza que haverão muitos resultados.

Mude a extensão do documento

Isso mesmo, pouca gente sabe, mas é possivel facilmente alterar a extensão de um arquivo PHP (.php), basta mudar a linha do httpd.conf (arquivo de configuração do apache) onde se lê: addType application/x-httpd-php .php para por exemplo addtype application/x-httpd-php .asp

Impedindo o acesso a determinadas extensões de arquivos

Existem extensões de arquivos bastante procuradas por hackers, .inc é um exemplo dessas, é conveniente impedir que seja possivel o acesso a arquivos com esta extensões. Para isso o apache tem uma diretiva de configuração (httpd.conf) chamada Files, como mostra Listagem 1.

Listagem 1: Modificando a diretiva Files do arquivo httpd.conf

<files *.inc>
	Order allow,deny
	Deny from all
  </files>

Cross-Site Scripting (XSS)

Cross-site scripting (XSS) é um tipo de vulnerabilidade do sistema de segurança de um computador, encontrado normalmente em aplicações web que activam ataques maliciosos ao injectarem client-side script dentro das páginas web vistas por outros usuários. Um script de exploração de vulnerabilidade cross-site pode ser usado pelos atacantes para escapar aos controlos de acesso que usam a mesma política de origem. [definição da Wikipedia].

Para evitar esse tipo de ataque no sistema web em PHP, você tratar os dados que usuario oferece como entrada com as seguintes funções:

  • string htmlentities(string input [,int quote_style [, string charset ] ])
  • Esta função converte caracteres que possuem significado especial em HTML para strings um browser pode mostrar como sendo fornecidos, em vez de executá-las como HTML.

  • string strip_tags(string str [, string allowed_tags])
  • Esta função permite escolhar que tags html serão permitidas na string.

SQL Injection

A Injeção de SQL, mais conhecida através do termo americano SQL Injection, é um tipo de ameaça de segurança que se aproveita de falhas em sistemas que interagem com bases de dados via SQL. A injeção de SQL ocorre quando o atacante consegue inserir uma série de instruções SQL dentro de uma consulta (query) através da manipulação das entrada de dados de uma aplicação. [Definição da Wikipedia]

Precauções a se tomar para evitar ataques via SQL injection:

Conclusão

Meu objetivo com esse artigo não foi dar um passo-a-passo de como fazer uma aplicação 100% segura, até mesmo porque isso não existe, mas sim abrir a mente dos desenvolvedores para esse lado da programação que muitos deixam de lado e acabam sofrendo as consequencias uma hora ou outra. Agradeço a quem leu este artigo até o fim, pois é o meu primeiro aqui no Linha de Código. Peço que comentem criticas e complementem o artigo nos seus comentários.

Referência bibliográfica: Dominando PHP e Mysql do iniciante ao profissional, W. Jason Gilmore . Wikipédia e PHP.net (manual do PHP).

Hiago Hubert

Hiago Hubert - Desenvolvedor web há 5 anos, cursando Ciência da computação na Universidade Federal do Rio Grande do Norte e curioso da área de segurança da informação, possui conhecimentos das tecnologias: HTML, CSS, PHP, ASP, Javascript e JQuery.