Grupo de Desenvolvedores de PHP de São Paulo
Próximos encontros e eventos? Visite a página do PHPSP no Meetup

Mais segurança em aplicações web com PHP

By

As falhas de segurança em servidores web é um assunto que está cada vez mais em evidência, e é necessário que os profissionais estejam sempre bem preparados e conhecendo as principais ameaças e as técnicas que ajudam a evita-las. Garantir a segurança de um sistema não é fácil, existem milhares de procedimentos que visam evitar acessos ou uso indevido de dados e recursos. Abaixo listo algumas dicas incomuns que podem ajudar a proteger seus sistemas desenvolvidos com PHP.

Evitando Spoofing de formulário

Spoofing de formulário ocorre quando alguém faz uma postagem em um de seus formulários de algum local inesperado. Uma técnica muito útil contra esse tipo de ataque é o uso de um token, ela consiste em guardar uma chave na sessão no momento de exibir o formulário, e quando os dados forem postados é confirmado se a chave enviada é a mesma gravada na sessão anteriormente. Essa dica é sugerida para formulários simples e não substitui o uso de Captcha que é uma alternativa mais efetiva contra robôs spams.

Sempre valide dados externos

Valide todo dado externo a sua aplicação (dados enviados via GET, POST, COOKIE, SERVER), todos esses dados podem ser manipulados e merecem sua desconfiança e consequente validação, com essa dica evitaremos ataques como XSS e SQL injection. Não esqueçam de validar também dados externos vindos de terceiro, como RSS e API’s socias.

Existe uma grande variedade de validações disponível nativamente no PHP, pra diversas situações, abaixo uma forma simples de lidar com dados externos.

Confira mais filtros em
http://www.php.net/manual/pt_BR/ref.filter.php

Mude o nome do cookie de sessão

Defina um nome para o cookie de sua sessão, nomes comuns facilitam o roubo de sessão, PHPSESSID é o nome padrão usado pelo PHP para guardar ids de sessão. Com o nome diferente o hacker terá dificuldade em saber qual o nome do cookie que guarda o id de sessão. Outra dica é usar nomes diferentes para cada acesso, usando algo vinculado ao acesso do visitante.

Cookies de sessão só devem ser acessados via http
Ids de sessão devem ser armazenados em cookies, essa é uma regra básica que já vem como padrão na configuração do PHP, algo que não vem como padrão é o atributo  session.cookie_httponly, que garante que os cookies de sessão só possam ser acessados via http, não podendo ser lidos por Javascript por exemplo, com isso estamos evitando ataques como XSS.

Limite o tempo de vida das sessões

Mesmo que os hackers consiga acessar seu sistema roubando uma sessão, eles terão pouco tempo de ação.

Valide a cada página a origem do dono da sessão

Valide a cada página o User Agent e o ip do dono da sessão, isso garante que o usuário que efetuou o login é o mesmo que está acessando a página atual.

Monitore os erros de senha

Em caso de mais de três tentativas de senha incorreta, bloqueie o IP de origem, ou adicione um Captcha como validação adicional, isso dificulta ataques de forca bruta.

Permissões em pastas

Restrinja as permissões de acesso nas pastas do sistema, ou seja, permissões de execução e escrita somente em pastas apropriadas.

Não armazene senhas em texto puro

Senhas não devem ser armazenadas sem “cifragem”, sempre armazenem as senhas criptografadas, assim estaremos protegendo também nossos usuários, numa eventual invasão ao banco de dados. Abaixo temos uma forma simples de criptografar uma senha, porém o armazenamento de senhas é algo mais crítico que isso. Para conhecer a forma mais correta de armazenar senhas clique aqui ou aqui

Uploads de arquivos

Sempre valide os arquivos antes de fazer uploads para o servidor, isso evita subir arquivos que possam ser executados e consequentemente trazer algum dano ao seu sistema. Validar apenas a extensão do aquivo não é o suficiente, pois esse pode ser manipulado no momento do envio. Para garantir o tipo do arquivo podemos usar a técnica de “magic byte” e também um anti-virus. Quando trabalhando com upload de imagem, pode ser feito o uso do trecho abaixo.

Proteja pastas contra acessos externos

Muitas vezes temos dados de configuração de sistemas em arquivos com extenções ini, XML, Json, txt e etc. O conteúdo desses arquivos são visíveis quando acessados pelo browser, logo, se nele contiver informações confidenciais, elas estarão expostas pra todos na internet. Para evitarmos isso, devemos proteger os diretórios que contenham esses arquivos contra acessos externos. Podemos colocar esses arquivos fora da pasta public_html ou adicionarmos um arquivo .htaccess com o código a seguir, nas pastas que queremos proteger.

Controle de erros

Controle as exceções e erros ocorridos eventualmente no seu sistema, evite exibir dados sobre sua aplicação, defina um arquivo de log para registrar esses erros. Caso precise acompanhar as informações do arquivo de log em tempo real, acesse o servidor via SSH e use o comando tail -f pathlog/logfile.

Servidores compartilhados

Há uma variedade de problemas de segurança que surgem quando se utiliza soluções de hospedagem compartilhada.

No passado, PHP tentou resolver alguns destes problemas com a diretiva safe_mode. No entanto, como o manual do PHP afirma, “é arquitetonicamente incorreto tentar resolver esse problema no nível do PHP. “Assim, safe_mode não estará mais disponível a partir do PHP 6. Ainda assim, há três diretivas do php.ini que continuam a ser importantes em uma hospedagem compartilhada: open_basedir, disable_functions e disable_classes. estas diretivas não depende de safe_mode, e eles permanecerão disponíveis para as versões futuras

open_basedir

Com essa diretiva é possível limitar os diretórios que o PHP pode abrir, com por exemplo fopen ou include.

disable_functions e disable_classes

Os disable_functions e disable_classes funcionam de forma semelhante, permitindo que você possa desabilitar certas funções nativas do PHP e classes por razões de segurança.

Desabilite as contas

Se for descoberto que seu sistema foi comprometido, investigue e descubra a falha explorada e principalmente desabilite as contas e defina uma estratégia de ativação utilizando e-mails.

Inspecione seu sistema

Use programas de identificação de vulnerabilidade, eles permitem identificar vulnerabilidades, oferece informações sobre e ainda orienta como resolve-las.

Programas de teste de vulnerabilidade

Software de exploração de vulnerabilidade: http://www.getmantra.com

Software de scan de aplicações web: http://www.mavitunasecurity.com/communityedition

 

Referências:

http://www.cyberciti.biz/tips/php-security-best-practices-tutorial.html

http://php.net/manual/en/security.php

Livro PHP Architect’s Guide to PHP Security

Por enquanto é isso, espero ter ajudado.

 

Sobre Alexsandro Souza

Desenvolvedor web desde 2009, com amplo conhecimento no desenvolvimento web, desde a administração de servidores Linux, passando por linguagens de back-end como PHP, C# e Java, até a camada visual com HTML5, CSS e Javascript. Possuo ainda formação em Análise de Sistemas e certificação Zend engineer. Usuário Linux desde 2011 e participante de comunidades de Javascript e PHP. Adoro desafios, tecnologia, desenvolvimento e a integração entre sistemas e plataformas.
  • http://rogeriopradoj.com/ Rogerio Prado de Jesus

    Valeu, @Alexsandro Souza! Muito boas as dicas!

  • Marcelo Silva

    Curti bastante!!!

  • Alexsandro Souza

    Valeu mano

  • Felipe

    Bem completo! Parabéns!