Seções iMasters
CodeIgniter + Framework + Segurança

Dicas de segurança em CodeIgniter

A segurança do seu aplicativo web não pode ser comprometida. Segundo a Symantec, uma das empresas de segurança mais importantes do mundo, existem quatro vulnerabilidades (XXS, SQL, Enumeração, Execução Remota) para aplicativos web.

A avaliação a seguir mostra os resultados de testes realizados em uma amostra do aplicativo web CodeIgniter para deduzir o nível de segurança do sistema. Se você é um desenvolvedor de aplicativos web escrevendo apps em PHP, o CodeIgniter tem muito a oferecer em termos de segurança.

Execução remota de código

Este tipo de ataque permite ao hacker executar um código indesejado de um local remoto usando scripts shell ou outras medidas. Isso é medido através de duas coisas.

Primeiramente, o arquivo htaccess deve ser configurado para permitir o acesso a apenas alguns diretórios, que representam uma ameaça mínima, se hackeado, como img/.

RewriteCond $1 !^(index\.php|img|robots\.txt)

Em segundo lugar, cada arquivo .php no CodeIgniter é protegido com a linha no topo.

<? php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

Isso garante que o arquivo .php não esteja acessível diretamente através da manipulação ou da execução de um script, o que comprometeria o sistema.

Injeção de SQL

Este tipo de ataque é muito comum na web. A injeção de SQL ocorre quando um invasor explora o front-end e os dados POST para recuperar dados seguros do banco de dados. De acordo com o manual do CodeIgniter, torna-se evidente que o seu aplicativo web está automaticamente salvo de injeção de SQL conforme os dados POST são recuperados no controller usando $this->input->post (‘’); que são automaticamente filtrados pelo CodeIgniter.

O trecho do manual do CodeIgniter comprova este fato:

Além de simplicidade, um grande benefício para o uso dos recursos do Active Record é que ele permite você crie aplicativos independentes de banco de dados, uma vez que a sintaxe da consulta é gerada por cada adaptador do banco de dados. Ele também permite consultas mais seguras, uma vez que os valores são escapados automaticamente pelo sistema.

Ataques XSS

Um ataque XSS ou Cross Site Scripting é sem dúvida a razão comum para o desaparecimento de aplicativos web. Um ataque XSS trabalha com um hacker elaborando uma URL maliciosa no navegador, a fim de comprometer a segurança do aplicativo. O CodeIgniter possui um filtro de XSS que é inicializado automaticamente.

Para verificar novamente as ameaças de segurança contra ataques XSS, um add-on chamado XXS Me (download aqui) pode ser usado para testar o aplicativo de exemplo contra 96 tipos diferentes de ataques. Os resultados são apresentados na figura abaixo. Ela mostra que todos os campos de entrada de formulário não foram encontrados não codificados, o que significa que o filtro XSS dentro do CodeIgniter fez o seu trabalho.

1

Enumeração de nome de usuário

A enumeração de nome de usuário pode ser impedida tendo uma chamada para uma função username_unique (veja imagem abaixo) em seus controladores que procuram por um nome de usuário existente, e se num_rows==1, não vão permitir que qualquer pessoa crie a conta com o mesmo nome de usuário novamente.

Além disso, mensagens de erro consistentes devem ser mostradas, uma que só revele que um certo nome de usuário  não está disponível e não mostre a lista disponível de usuários válidos, pois isso poderia ser usado pelo criminoso para fazer suposições para um ataque.

2

Outros recursos de segurança no CodeIgniter

Além dos mencionados acima, existem alguns recursos de segurança menores que os desenvolvedores de aplicativos web podem aplicar. Por exemplo, certifique-se de que o seu aplicativo web não permita que quaisquer dois grupos de usuários diferentes acessem as contas do outro na mesma sessão.

Isso é possível codificando os dados da sessão com ID de usuário e tipo de usuário, para que ele possa ser utilizado para determinar se a conta pertencente ao usuário cujos dados estão na sessão ativa.

Quando se trata de armazenar senhas, o algoritmo MD5 deve ser usado para criptografar senhas. Além disso, se você estiver usando o upload de arquivos, certifique-se de que os nomes de arquivos estejam codificados com uma string de 32 bits aleatória, para que a informação privada ou sensível seja anônima.

Além disso, a biblioteca de validação de formulário do CodeIgniter pode revelar-se muito útil. A validação de formulário garante que informações inválidas não sejam inseridas no banco de dados. Para proporcionar uma dupla camada de segurança, a estrutura do SQL pode ser tal que cada campo esteja de acordo com os dados de formulário de entrada por a) tipo e b) comprimento.

Testes de segurança global

A extensão do Google Chrome chamada Websecurify é um software legal que testa a segurança de qualquer aplicativo web contra cerca de 20 tipos de ataque mais populares. Você pode baixá-lo aqui.

***

Texto original da equipe Monitis, liderada por Hovhannes Avoyan, disponível em http://blog.monitis.com/index.php/2012/10/09/codeigniter-security-tips/

Comente também

4 Comentários

Leonardo Meloni

Ótimo artigo

Croves

Eu sinceramente deixo a responsabilidade do “Enumeração de nome de usuário” com o banco de dados, setando o campo como UNIQUE. Na hora da execução do script (cadastro do usuario, por exemplo), utilizo try/catch. O próprio engine do DB vai retornar um erro, que será tratado pela exceção.

O uso de IFs e funcões desnecessárias – como nesse caso – apenas aumenta a complexidade do código e não contribui efetivamente com segurança e/ou performance no software.

Teste

Certissimo Croves, não é preciso fazer a mesma tarefa 2x…

Johantan

Gostei, ótimo artigo.

Qual a sua opinião?