Segurança na Aplicação PHP


Abaixo pequeno post para o desenvolvimento de aplicações seguras utilizando a linguagem PHP, eliminando os equívocos geralmente relacionados à esta.

Um dos equívocos mais comuns relacionados à linguagem PHP é o de que é difícil de se produzir sistemas e ferramentas seguras quando a utilizamos. Este equívoco é fundamentado em 3 conceitos:

  • A simplicidade da linguagem, com uma baixa curva de aprendizado
  • A própria fragilidade da web como ambiente de aplicações
  • Algumas features presentes na linguagem

Conceitos: Web: “A Terra de Ninguém”:

 O Problema: A web é um ambiente precário em termos de segurança. Dificuldade para identificar os usuários, ameaças que proliferam às dezenas e usuários descuidados são lugares comuns quando tratamos de uma aplicação web.

 A Solução: Criar o hábito de pensar qualquer aplicação web, por mais simples que seja, levando-se em consideração a questão de segurança. Termos a noção de que é nossa responsabilidade como desenvolvedores criar aplicações que sejam minimamente seguras.

 Aplicações mais maduras:

 O Problema: Algumas features que podem ser utilizadas na linguagem, como a ativação da configuração register_globals, facilitam o trabalho, mas inevitavelmente aumentam riscos de segurança e acostumam mal o desenvolvedor.

 A Solução: Nos acostumarmos a desempenhar nosso trabalho da melhor forma possível, tendo sempre em mente que tudo o que é fácil tem seu preço e o que dá mais trabalho hoje causará menos incômodos amanhã.

 Boas Práticas:

Continuar a ler

Robots.txt forma segura


Robô (em informática / WEB) é uma ferramenta automática que fica percorrendo sites e coletando informações, verificando se houveram alterações ou validando suas informações.

A princípio os robôs (robots) podem acessar qualquer página/conteúdo/imagem do seu site sem que você tenha que dar permissão para tal. Mas você pode criar um arquivo chamado robots.txt na raíz do seu site e, dentro dele, escrever algumas regras que te ajudarão a controlar o que os robôs fazem no site.

Imagine o robots.txt como uma lista de convidados para uma festa… Se não tá na lista não entra. A única diferenças é que com o robots.txt não há penetras. Você pode bloquear tanto o site inteiro como documentos e arquivos específicos, facilitando assim o controle de “quem entra” no seu site.

Criando o seu robots.txt

Suponhamos que você tenha um arquivo chamado confidencial.html na raiz do site e você não quer que os indexadores dos sistemas de buscas e nenhum outro tipo de robô tenha acesso a esse arquivo… É só colocar isso aqui no seu robots.txt:

1    User-agent: *
2    Disallow: /confidencial.html

Isso fará com que nenhum robot consiga acessar o arquivo especificado… Mas você também quer bloquear uma pasta do site para que nenhum robozinho possa entrar e ver algum arquivo dentro dela:

1    User-agent: *
2    Disallow: /confidencial.html
3    Disallow: /minhapasta/

Comentários no robots.txt

Se você é organizada e quer colocar comentários no seu robots é só usar o caractere “tralha” (#) para isso, dessa forma:

1    # A regra servirá para todos os tipos de robôs
2    User-agent: *
3    # Meu arquivo de senhas ultra-secretas que ninguém pode saber
4    Disallow: /confidencial.html
5    # Bloqueando a minha pasta cheia de fotos ;X
6    Disallow: /minhapasta/

Bloqueando um site inteiro

Para bloquear o acesso completo de todos os robôs ao seu site?  Não precisa tirar ele do ar, e só fazer isso:

1    # Adios~
2    User-agent: *
3    Disallow: /

Criando a lista VIP da festa

Tem gente que prefere bloquear todo mundo e permitir só alguns, e com o robots.txt não é diferente:

1    # Permitindo apenas dois arquivos e uma pasta:
2    User-agent: *
3    Allow: /meu_arquivo.html
4    Allow: /pasta/contato.html
5    Allow: /imagens/
6    Disallow: /

Isso fará com que apenas os dois arquivos especificados e a pasta sejam acessíveis, o restante será bloqueado.Ainda existem outras regras que limitam o acesso dos robôs a um certo horário do dia ou a uma quantidade limite de visitas por dia ou por arquivo

Artigo originalmente publicado em 10 de junho de 2009 por Thiago Belem: Usando o Robots.txt de forma correta

leia também : Passo a Passo para um Teste de Penetração (PenTest)

PHP IDS


PHP IDS, que é uma classe/sistema para a segurança do site. A sua função se resume em vasculhar todas as possíveis entradas de informações do site ($_POST, $_GET, $_COOKIE e etc.) em busca de algo que possa ser uma tentativa de ataque e/ou invasão. Ele foi criado para a proteção de sites que usam e abusam das “funcionalidades” da WEB 2.0.

Se alguém inserir, por exemplo, um código SQL para tentar um SQL Injection no seu site, o PHP IDS vai pegar, vai avisar (ou não) sobre a tentativa de ataque, vai evitar o estrago e ainda te avisa (ou não) por e-mail. No total ele te protege dos seguintes tipos de ataque: XSS, SQL Injection, header injection, directory traversal, RFE/LFI, DoS e LDAP.

Para instalação :
1 – Faça o download dele no site oficial.
2 – Descompacte a pasta ../libs/IDS na raiz (root) no site (mantendo a pasta IDS).
3 – Insira o seguinte bloco de código no começo do site:

01    // Inclui o arquivo do PHPIDS
02    require_once ‘IDS/Init.php’;
03    $request = array(
04    ‘REQUEST’ => $_REQUEST,
05    ‘GET’ => $_GET,
06    ‘POST’ => $_POST,
07    ‘COOKIE’ => $_COOKIE
08    );
09    // Inicia o PHPIDS
10    $init = IDS_Init::init(‘IDS/Config/Config.ini’);
11    $ids = new IDS_Monitor($request, $init);
12    $result = $ids->run();
13    
14    if (!$result->isEmpty()) {
15    // Exibe resultados caso sejam encontrados
16    echo $result;
17    }

Com isso ele já vai passar a funcionar… Vale lembrar que esse exemplo apenas avisa (mostra) que algo foi encontrado e bloqueia… Você vai  precisar adaptá-lo as suas necessidades. Para configurar suas funções e usá-lo da melhor forma, é recomendado que você dê uma olhada no arquivo Config.ini e/ou veja a página de FAQs.

Artigo originalmente publicado em 1 de junho de 2009 por Thiago Belem: Instalando o PHPIDS no seu site

leia também : Scanner KisMAC – WI-FI

Criptografia no PHP usando Sha512, Whirlpool e Salsa20


Todos os três são criptografias de alto nível que geram strings de 128 caracteres com chances absurdamente remotas de colisão. Todos os três são criptografias de mão única, ou seja, a única coisa que pode fazer com a string depois de criptografada é comparar com outra string para ver as duas são iguais… Não há como “descriptografar” a string gerada por esses algoritmos.

Para usar esses métodos de encriptação  precisará usar a função hash( ) do PHP.

SHA-512

O SHA-512 é a versão melhorada do SHA-265, que por sua vez é uma versão muito melhor do SHA-1. Para encriptar uma string usando SHA-512, no PHP, pode fazer assim:

1 <?php
2
3 $string = ‘O rato reu a ropa do rei de Roma’;
4 $codificada = hash(‘sha512’, $string);
5    
6 echo “Resultado da codificação usando sha512: ” . $codificada;
7    
8 ?>

Ao executar o código acima verá uma string de 128 caracteres, é essa string que deve salvar no banco de dados para manter a senha realmente segura. O resultado dessa encriptação com SHA-512 é algo assim (quebrei em três linhas para ficar “legível):

3b1efb1934a56460904a2ae4782490d06057985a1524
5bb887ed4cda89e82cfa3c4ab2589686cb1828228c8e
6d252aa5272cbf1b1ec44978e302d5f7b7cd4641

Whirlpool

O Whirlpool é um pouco mais lento que o SHA-512 e, consequentemente, mais “entrópico”, ou seja: mais seguro. Para encriptar uma string usando Whirlpool, no PHP, pode ser feito:

1 <?php
2    
3 $string = ‘O rato reu a ropa do rei de Roma’;
4 $codificada = hash(‘whirlpool’, $string);
5
6 echo “Resultado da codificação usando whirlpool: ” . $codificada;
7
8 ?>

O resultado desse Whirlpool será algo assim:

f13697ecb3e10789449ed839f224376b633eadbe3739
c07c7843bf91a86f4374d3697924e3c396cfeb777b56
d38700c41e032c21c4fce52d5f59024969536c74

Salsa20

E por fim, mas tão poderoso quanto, o Salsa20 é outro algoritmo de encriptação que irá gerar uma string de 128 caracteres. O Salsa20 foi criado para encriptação de stremings/transmissões, mas pode ser usado com strings simples também.

Para encriptar uma string usando Salsa20, no PHP,  pode fazer assim:

1 <?php
2
3 $string = ‘O rato reu a ropa do rei de Roma’;
4 $codificada = hash(‘salsa20’, $string);
5
6 echo “Resultado da codificação usando salsa20: ” . $codificada;
7    
8 ?>

O resultado desse Salsa20 será algo assim:

56a296fad140971d0fcd1577bd0c66348e69a835e9f4
56857a0e9f43e8fe540ad4488099875daaf8741df89f9
6abb8c6cd08ed842db33b2ea356737fc2cb0aef

Salvando esses dados no banco de dados

Para salvar esse tipo de dado [criptografado] você pode usar um campo CHAR(128) pois sabemos que sempre teremos 128 caracteres ali.

Encontrando registros criptografados no banco de dados

Suponhamos que você queira encontrar um usuário no seu banco de dados comparando a senha digitada (no formulário de login) com a senha armazenada utilizando o método Whirlpool. O código PHP para montar a consulta SQL seria mais ou menos assim:

01 <?php
02    
03 $usuario = ‘thiago’; // Nome do usuario (digitado pelo usuario)
04 $senha = ‘12345’; // Senha (digitada pelo usuario)
05    
06 // Encripta a senha utilizando Whirlpool
07 $whirlpool = hash(‘whirlpool’, $senha);
08    
09 $sql = “SELECT * FROM `usuarios` WHERE `usuario` = ‘{$usuario}’ AND BINARY `senha` = ‘{$whirlpool}'”;
10    
11 ?>

Artigo originalmente publicado em 24 de setembro de 2010 por Thiago Belem: Criptografia no PHP usando Sha512, Whirlpool e Salsa20