Gerador de senha aleatória em PHP [UPDATE]

Continuando com a série de posts sobre PHP, segue um script que foi útil para o desenvolvimendo do novo And After.

Por questões de segurança a senha dos usuários ficam criptografadas no banco (MD5) e o processo é irreversível (pelo menos em teoria) – isso impede a recuperação delas e cria a necessidade de regerar uma senha aleatória caso o usuário esqueça a sua.

Baseado em em um script da webtoolkit fiz algumas alterações (insignificantes) para atender exatamente ao que eu precisava, abaixo segue a função generatePassword que recebe um único parâmetro ($length) que indica o tamanho do password gerado.

 

function generatePassword($length) {
  $vowels = "aeiouyAEIOUY";
  $consonants = "bdghjmnpqrstvzBDGHJLMNPQRSTVWXZ0123456789";
  $password = "";
  $alt = time() % 2;
  for ($i = 0; $i < $length; $i++) {
    if ($alt == 1) {
       $password .= $consonants[(rand() % strlen($consonants))];
       $alt = 0;
    } else {
       $password .= $vowels[(rand() % strlen($vowels))];
       $alt = 1;
    }
  }
  return $password;
}

O script tem 2 conjuntos de caracteres (nas variáveis vowels e consoants) e intercala um caractere randômico de um grupo com um caractere randômico de outro grupo até a string (nosso password) atingir o tamanho requisitado.

[update]

O Carlos André Ferrari comentou uma outra função, com menos código porém sem intercalar os grupos de caracteres (vogais e consoantes) para gerar a senha, porém igualmente funcional:

function generatePassword($length=6) {
	return substr(str_shuffle("aeiouyAEIOUYbdghjmnpqrstvzBDGHJLMNPQRSTVWXZ0123456789"), 0, $length);
}

[/update]

 

Se você quiser aumentar o nível de segurança pode inserir caracteres especiais em uma das variáveis da string usada…

Selecionando posts relacionados pelas tags (Code Igniter com Data Mapper)

Desenvolvendo o backend da nova versão do And After resolvi aprimorar o sistema de recomendações de posts relacionados do site e torná-lo mais relevante para os leitores.

Para acompanhar este post é necessário entender sobre relacionamento no banco de dados, saber um pouco como funciona o Data Mapper, a ferramenta ORM e também ter uma noção de relacionamento de tabelas com o Data Mapper.

Posts relacionados – Como funciona hoje?

Atualmente o sistema pega as tags de um post e, uma a uma, busca outros posts que utilizem a mesma tag. Estes posts são exibidos (sem repetição) e com um limite estipulado.

Isso significa que as últimas tags do post que o leitor está lendo podem ser ignoradas – pois possivelmente com as primeiras tags o sistema de relacionamento já tem posts suficientes para uma lista de recomendação.

 

Como deveria funcionar?

Para "afinar" o sistema de recomendação o ideal é levar em consideração todas as tags de dois posts que podem ser similares e ver quantas tags eles tem em comum. Quanto mais tags em comum, mais relacionado está o texto – porém não podemos esquecer de levar em consideração a data de publicação do mesmo, para evitar ficar exibindo apenas posts muito antigos.

 

Tecnologias

Estou utilizando PHP com o framework Code Igniter (tudo bonitinho com MVC) e banco de dados MySQL, a ferramenta ORM utilizada é o Data Mapper (leia também: como instalar e configurar o Data Mapper no Code Igniter).

Para atingir o objetivo criei a seguinte regra de negócio:

  • Percorrer cada tag que o post atual tem e buscar os posts recentes que contém esta mesma tag.
  • Atribuir um "ponto" para cada vez que um post é encontrado
  • Ordenar a lista de posts relacionados pelos "pontos" (número de vezes que um post retornou como relacionado do atual)

 

Vamos ao código! A função abaixo recebe duas variáveis: $post (o id do post que o usuário está lendo) e $limit (quantos posts relacionados devem retornar no array de resultado).

function getRelatedPost($post, $limit) {
  //Pega o post atual e suas tags
  $p = new Post();
  $p->select("id");
  $p->where("id", $post);
  $p->get(1);
  $tags = $p->tag->get();
  $arr = array();
  //Percorre as tags do post atual
  foreach($tags as $t){
    //pega os posts relacionados pela tag
    $related = new Post();
    $related->where_related_tag("id", $t->id);
    $related->where("id <>", $post);
    $related->order_by("creationDate DESC");
    $related->get($limit);
    //Se existirem posts, percorre cada post relacionado para esta tag
    if(!empty($related->id)){
      foreach($related as $pr){
        //Se o post já existir no array soma mais um ponto para ele
        //Se ele não existir cria ele no array com valor 1
        $id = $pr->id;
        if(!empty($arr[$id])){
          $arr[$id] = ($arr[$id]+1);
        }else{
          $arr[$id] = 1;
        }
      }
    }
  }
  //Ordena o array pelos pontos
  //e pega cada post relacionado para retornar como resultado
  arsort($arr, SORT_REGULAR);
  $relArr = array();
  foreach ($arr as $i => $value) {
    $relArr[] = $this->getPostById($i);
  }
  return($relArr);
}
 
 
 
Lembrando que estou utilizando a versão OverZealous do Data Mapper, que foi desenvolvida como um upgrade da versão padrão desta ferramenta.
 
E agora o que rola por trás deste código todo, que o Code Igniter retorna no benchmark para os curiosos de plantão:
 
 
SELECT `tags`.*
FROM (`tags`)
LEFT OUTER JOIN `posts_tags` as posts_tags ON `tags`.`id` = `posts_tags`.`tag_id`
LEFT OUTER JOIN `posts` as posts ON `posts`.`id` = `posts_tags`.`post_id`
WHERE `posts`.`id` = 8 
 
 
SELECT `posts`.*
FROM (`posts`)
LEFT OUTER JOIN `posts_tags` as posts_tags ON `posts`.`id` = `posts_tags`.`post_id`
LEFT OUTER JOIN `tags` as tags ON `tags`.`id` = `posts_tags`.`tag_id`
WHERE `tags`.`id` = 14
AND `posts`.`id` <> 8
ORDER BY `posts`.`creationDate` DESC
LIMIT 5 

 

Qualquer dúvida, correção ou melhoria no código comente! 🙂

Entendendo o relacionamento de tabelas no banco de dados

Dando continuidade ao tutorial do Data Mapper para Code Igniter hoje vou escrever sobre um assunto que sempre complicou minha vida quando o assunto é MySQL: relacionamento de tabelas.

Este post explicará apenas o básico sobre relacionamento, quando finalizei ele tratando de relacionamento e do uso de relacionamentos no Data Mapper ele acabou bastante extenso, optei por quebrar o post em dois para facilitar a leitura.

Se você já entende de relacionamentos não perca tempo com este post, aguarde o tutorial específico de como usar relacionamentos no Data Mapper para Code Igniter (será linkado neste post assim que for publicado!).

 

O que é relacionamento de tabelas?

Primeiro vamos entender um pouco sobre o funcionamento e tipos de relacionamento, deixando de lado o Data Mapper e falando apenas da questão lógica do negócio.

O relacionamento existe quando um ou mais dados de uma tabela estão relacionados de alguma forma com um ou mais dados de outra tabela.

Por exemplo, temos uma tabela d usuários (users) e uma tabela de posts (posts), cada usuário pode publicar infinitos posts porém cada post poderá ter apenas um usuário. Estas tabelas estão relacionadas.

Existe também relacionamento de dados de uma tabela com outros dados desta mesma tabela. Um usuário (user) pode ter vários amigos da mesma tabela (user), então os dados estão relacionados com dados da mesma tabela.

Agora vamos aos tipos de relacionamento:

 

Relacionamento um para um (one to one)

Neste tipo de relacionamento um dado de uma tabela equivale a um dado em outra tabela exatamente.

Por exemplo um usuário (table users) está relacionado a um endereço na tabela adress, e cada endereço só está relacionado a um usuário.

 

Relacionamento um para muitos – One to Many

No relacionamento um para muitos um dado da tabela um pode estar relacionado a diversos dados da tabela dois, porém cada dado da tabela dois estão relacionados a apenas um dado da tabela um.

Por exemplo um user (table users) pode estar relacionado a diversas casas (table houses), porém cada casa só está relacionada a um user.

 

Relacionamento muitos para muitos – Many to many

No "many to many" os dados da primeira tabela podem estar relacionados a diversos dados da segunda tabela e os dados da segunda tabela também podem estar relacionados a diversos dados da primeira tabela.

Exemplo: um usuário pode ter diversas habilidades (user com diversos relacionamentos para a tabela skills) e cada habilidade também pode estar relacionada a diversos usuários (dado da tabela skill relacionado a diversos dados da tabela users).

 

 

Estrutura das tabelas para relacionamento

Agora que já conhecemos os tipos de relacionamento, vamos entender como estruturar nosso banco de dados para permitir o acesso fácil aos dados relacionados.

Quando o relacionamento é um para um ou um para muitos podemos estruturar as colunas diretamente na tabelas relacionadas, continuando com o exemplo da tabela users e posts, na nossa tabela posts  podemos ter uma coluna chamada user_id  que identifica a qual user está relacionado aquele post.

Table users

id | name | email

 

Table posts

id | title | content | user_id

 

No exemplo acima temos automaticamente um relacionamento um para muitos de users->posts e um para um de posts->users.

Quando o relacionamento é muitos para muitos a estrutura do exemplo acima não é viável (a não ser com uma boa gambiarra, com split de valores e performance porca como eu já fiz). A solução é "quebrar" o relacionamento e inserí-lo em uma nova tabela destinada somente a isso.

Vamos supor que temos uma tabela images onde ficam armazenadas as imagens relacionadas aos posts. Um post poderá ter diversas images e uma image poderá ser utilizada em múltiplos posts. Para fazer este relacionamento criamos uma tabela de relacionamento, que para ilustrar este exemplo chamaremos de images_posts e terá a estrutura abaixo:

TABLE IMAGES_POSTS

id | image_id | post_id

 

Com este tipo de estruturação podemos relacionar infinitos posts com infinitas images. Por exemplo, o post com id = 4 poderá ter as imagens com id = 8, id = 9 e id = 10.

Teremos:

TABLE IMAGES_POSTS

id | image_id | post_id

1  | 8                | 4

2  | 9                | 4

3  | 10              | 4

 

Pronto, estrutura feira e as images 8, 9 e 10 também poderão estar relacionadas a outros posts também, apenas inserindo mais dados nesta tabela de relacionamento.

 

O próximo post explicará como inserir, acessar e manipulas dados de tabelas com relacionamento utilizando a ferramenta ORM Data Mapper para Code Igniter!

Espero que este post seja uma boa referência para estudos, para dar continuidade ao aprendizado veja alguns livros sobre MySQL que podem te ajudar.

Usando o Data Mapper no Code Igniter

Este post nasceu da necessidade de explicar um pouco mais o funcionamento do Data Mapper para o framework Code Igniter, para ficar mais fácil fazers posts mais avançados utilizando esta ótima ferramenta.

O que é Object-relational mapping (ORM)?

ORM é uma técnica que facilita o acesso e manipulação de banco de dados "transformando-os" como se fossem objetos.

Utilizando ORM o desenvolvedor não precisa se preocupar em escrever a SQL diretamente, a ferramenta ORM (no meu caso o Data Mapper) representa as tabelas do banco de dados com classes, e instâncias destas classes fazem as manipulações e consultas necessárias.

As principais vantagens do ORM é a produtividade, pois o código escrito reduz bastante, facilitando desenvolver e manter aplicações.

Eu comecei recentemente a utilizar o Code Igniter (o primeiro projeto é o novo And After) e estou gostando muito, estou muito mais produtivo mesmo trabalhando com linguagem e ferramentas que ainda não domino completamente: PHP, Code Igniter e ORM.

 

Database

Database,database… qual era aquela coluna mesmo?

Data Mapper

Data Mapper (DM) é um ORM para quem utiliza o framework Code Igniter (CI), e facilita muito qualquer consulta e manipulação ao banco.

O primeiro passo é instalar o Data Mapper no seu CI, seguindo os passos abaixo:

  1. Baixe a última versão do DM e descompacte
  2. Opcional: faça suas configurações do DM no arquivo application/config/datamapper.php
  3. Coloque o  application/config/datamapper.php na pasta application/config folder do seu CodeIgniter
  4. Coloque o application/libraries/datamapper.php na pasta application/libraries do seu Code Igniter.
  5. Coloque o application/languages/english/datamapper_lang.php na pasta application/language/english do seu Code Igniter (aqui você pode adicionar os idiomas que quiser, eles contem as mensagens de erro do DM).
  6. Configue o  application/config/autoload.php e adicione a biblioteca do datamapper e database no array do autoload

$autoload["libraries"] = array("database", "datamapper");

Com isso seu aplicativo deve estar pronto para utilizar o Data Mapper!

Abaixo vou publicar exemplos básicos de uso do Data Mapper para consultar o seu banco alterar e inserir dados. Será bem superficial, o objetivo deste post é introduzir  ORM e o Data Mapper para quem está começando ou pretende começar a utilizar o Code Igniter.

 

Começando – uma classe para cada tabela

Relembrando: utilizando uma ferramenta ORM (neste caso o Data Mapper) cada tabela será representada por uma classe no seu Model (usando MVC), e esta classe extenderá a classe do Data Mapper.

Como exemplo vou usar parte do código do backend desenvolvido para o And After, temos uma tabela users, então na camada Model temos a seguinte classe:

class User extends DataMapper {
    var $table = "users";

    function User()
    {
        parent::DataMapper();
    }
}

 

Neste exemplo acima a definição da variável $table é opcional, pois quando ela não está definida o Data Mapper automaticamente define table como o plural (adicionando o "s" ao final) do nome da sua classe. 

 

Consultando o banco de dados – Função Get

Agora vamos ver como o Data Mapper aumenta a produtividade no desenvolvimento, no exemplo abaixo vou fazer uma consulta que retorne todas as linhas e colunas da tabela users, utilizando a classe User criada no exemplo acima.

$u = new User();
$u->get();

Fácil assim, o $u é um objeto com todos os resultados da nossa consulta que seria o mesmo que:

get * from users

 

Limit

Sabemos que não é bom para a performance da nossa aplicação o get * e nem consultas sem um LIMIT definido, para definir o limite é simples, vamos retornar 5 usuários apenas:

$u = new User();
$u->get(5);

E no exemplo abaixo, pegando 5 usuários começando a partir do 10:

$u = new User();
$u->get(5,10);

 

Selecionando as colunas – select

E agora selecionando as colunas que serão retornadas para evitar consultar dados desnecessários, vamos pegar apenas o user e email dos usuários.

$u = new User();
$u->select("user,email");
$u->get(5);

 

Fazendo buscas – where

Vamos buscar o usuário que tenha o user "tester":

$u = new User();
$u->where("user", "tester");
$u->get(1);

 

Você pode usar diversos "where" em uma mesma consulta, e existe também o "or_where" como no exemplo abaixo:

Fazendo buscas – or_where

$u = new User();
$u->where("user", "tester");
$u->or_where("id", "1");
$u->get();

Neste caso vai retornar 1 user se o user com ID 1 for o "tester" ou dois, caso eles sejam diferentes.

 

Ordenando a consulta – order_by

Pegando 15 usuários ordenados pelo nome:

$u = new User();
$u->order_by("name asc")
$u->get(15);

 

Aqui estão os exemplos básicos de consultas utilizando o Data Mapper, recomendo que você leia e releia a documentação da função Get (en) para consultas avançadas.

 

Manipulando os objetos da consulta

Agora você aprendeu a fazer a consulta, já tem sua camada de Model estruturada com uma classe para cada tabela, vamos manipular os dados!

Para exemplificar como é a manipulação dos dados de uma consulta, vamos criar um array com o nome dos últimos usuários cadastrados:

//Consulta os usuários ordenado pela data
$u = new User();
$u->select("name");
$u->order_by("date DESC");
$u->get(10);

//Vamos criar um array com o nome dos usuários da consulta acima
$arr = array();
foreach ($u->all as $user)
{
    $arr[] = $user->name;
}

 

Quando o resultado é apenas um objeto pode ser feito da seguinte forma:

$u = new User();
$u->select("id,name");

$u->get(1);

echo $u->id ." - ". $u->name;

 

Espero que você, que usa o Code Igniter mas ainda não usa o Data Mapper em breve seja mais um adepto!

O próximo post sobre o Code Igniter será o relato da dificuldade que tive para estruturar a primeira aplicação e dividir corretamente as camadas Model, View e Controller (MVC) e do Data Mapper já tenho um começado que trata de relacionamento de tabelas do banco de dados utilizando esta ferramenta.

Espero que gostem, dúvidas, críticas e sugestões nos comentários!

Segurança com PHP (slides)

Como o prometido, estou realmente estudando PHP e deixando o ASP, reflexo disso é uma mudança no conteúdo do O Desenvolvedor, que está ficando recheado de posts sobre PHP – com a ajuda do Chris e do Furst.

Depois dos slides sobre as Novidades do PHP 5, hoje trago mais slides, desta vez para falar de Segurança. Essa foi a apresentação do Rafael Jaques no Tchê Linux 2009.

 

A apresentação fala dos tipos de ataque mais comuns e apresenta soluções e boas práticas para elevar a segurança das aplicações desenvolvidas.

 

E para quem não conseguir ver a apresentação no SlideShare, segue a versão em texto:

 

  1. Construindo uma aplicação PHP à Prova de Balas
    • Rafael Jaques
    • TcheLinux – Porto Alegre – 14/11/09
    • “ Buscai primeiro o reino do Senhor e a sua justiça, e todas as demais coisas vos serão acrescentadas” (Mateus 6.33)
  2. Pauta
    • Um pouco sobre segurança
    • Conhecendo os meios de ataque
    • Outros tipos de ameaça
    • Mais alguns cuidados
    • Perguntas
  3. Um pouco sobre segurança 1
  4. O que é segurança?
    • Segurança baseia-se em três pontos:

    CONFIDENCIALIDADE INTEGRIDADE DISPONIBILIDADE

  5. O que é segurança? Não se iluda. Não existem aplicações 100% seguras. Não ouse dizer isso… Você poderá ter sérios problemas.
  6. O quão segura deve ser a sua aplicação? Você deve encontrar um equilíbrio entre a segurança e a usabilidade do seu sistema. Crie um sistema com pouca segurança e ele será invadido . Crie um sistema com muita segurança e ele será impossível de usar .
  7. O quão segura deve ser a sua aplicação? Evite investir esforços onde não é necessário. Sempre revise o que você projetou.
  8. Os custos que envolvem uma aplicação segura Aplicações seguras tendem a custar caro… Aplicações não seguras tendem a custar mais caro ainda…
  9. Os custos que envolvem uma aplicação segura
    • Maior tempo de projeto e pesquisa
    • Programação extendida
    • Testes mais minuciosos
    • Maior uso de hardware
    • Maior uso de banda
    • Treinamento de pessoal interno
    • Treinamento do usuário

    Entre os custos envolvidos no desenvolvimento da aplicação, temos os seguintes pontos:

  10. não sacrifique a usabilidade do projeto
  11. Conhecendo os meios de ataque 2
  12. Quais os tipos de ataque que posso sofrer?
    • XSS (Cross-site Scripting)
    • SQL Injection
    • Session Hijacking
    • Cookie Theft

    Existem diversos tipos de ataque através da internet. Eis alguns:

    • Brute Force
    • Rainbow Table
    • Password Sniffing
    • Entre outros…
  13. XSS Cross-site Scripting O que é? Injeção de código arbitrário em uma página. Como ocorre? Geralmente através de brechas em formulários onde os dados enviados ao servidor não são devidamente filtrados.
  14. XSS Cross-site Scripting Exemplo
  15. XSS Cross-site Scripting Exemplo
  16. XSS Cross-site Scripting Como evitar Existem funções prontas no PHP para filtrar strings. Utilizando-as, além de evitar um XSS, você garante que o usuário conseguirá expressar o que realmente intentou.
  17. XSS Cross-site Scripting Como evitar
    • Funções que você pode utilizar:
    • htmlspecialchars()
    • htmlentities()
    • filter_input()

    Leia mais sobre XSS: http://tinyurl.com/mais-sobre-xss

  18. SQL Injection O que é? Injeção de código SQL arbitrário dentro de uma consulta legítima. Como ocorre? Na maioria das vezes a injeção de código SQL se dá a partir de formulários não filtrados, em que os dados recebidos vão diretamente para dentro da consulta.
  19. SQL Injection Exemplo
  20. SQL Injection Exemplo 1" OR 1="1
  21. SQL Injection Exemplo fulano"# ou fulano" —
  22. SQL Injection Como evitar Novamente… Filtrando os dados enviados pelo usuário é possível evitar que seja injetado código dentro do seu SQL.
  23. SQL Injection Como evitar
    • Funções que você pode utilizar:
    • addslashes()
    • mysql_real_escape_string()

    Leia mais sobre XSS: http://tinyurl.com/mais-sobre-sql-injection

  24. Session Hijacking O que é? Quando o invasor obtém acesso à sessão de um usuário autenticado. Como ocorre? Sempre que os dados do cliente são armazenados em sessão é gerado um ID. Caso alguém o descubra, poderá navegar pelo site como se fosse o usuário real.
  25. Session Hijacking Atenção… Hoje, com as configurações padrão do PHP é bem pouco provável que você sofra um ataque de roubo de sessão no seu site. Para tanto você deve estar atento às seguintes configurações:
  26. Session Hijacking Atenção… session.use_cookies session.use_only_cookies
  27. Session Hijacking Exemplo algumapagina.php?PHPSESSID=1234
  28. Session Hijacking Como evitar Nunca confie 100% no ID de sessão recebido. Você pode fazer algumas verificações redudantes, como comparar o IP e o User-Agent. Em casos mais vitais você pode sugerir ao usuário que utilize cookies, intruindo-o e falando da sua importância para uma navegação mais segura no site. Leia mais sobre Sess. Hijacking: http://tinyurl.com/mais-sobre-sess-hijacking
  29. Cookie Theft O que é? A tradução literal é “Roubo de Cookie”. Na verdade a literal mesmo é “Roubo de Biscoito”. 😛 Trata-se capturar cookies na máquina da vítima e utilizá-los para acessar o local desejado. Como ocorre? O roubo de cookie pode possuir duas naturezas: XSS e vulnerabilidades no próprio browser.
  30. Cookie Theft Como evitar O script que foi apresentado anteriormente no exemplo de XSS é responsável por roubar um cookie. Atualmente não são muito comuns falhas de browsers que permitam o roubo de cookies, mas no passado houveram muitos .
  31. Cookie Theft Como evitar No site do PHP Security Consortium [1] você pode consultar o resumo da newsletter da SecurityFocus [2], que possui sempre anúncio de novas vulnerabilidades encontradas. A partir disso você pode conscientizar os seus usuários caso perceba que os mesmos utilizem um browser vulnerável. [1] http://phpsec.org/projects/vulnerabilities/securityfocus.html [2] http://securityfocus.com/vulnerabilities
  32. Brute Force Attack O que é? O ataque por força bruta baseia-se na busca exaustiva da informação procurada, através de tentativa e erro com todas as possibilidades existentes. Como ocorre? O usuário mal intencionado acessa o formulário no qual irá tentar o ataque e utiliza um programa, estipulando uma cadeia de caracteres e um tamanho máximo para a frase. O programa irá tentar todas as combinações possíveis até que uma dê certo.
  33. Brute Force Attack Atenção… Este tipo de ataque é bastante semelhante ao Ataque de Dicionário . A diferença é que o dicionário esgota suas possibilidades mais rápido utilizando apenas palavras existentes e senhas comuns.
  34. Brute Force Attack Como evitar Existem dois meios bastante comuns de evitar este tipo de ataque: limite de tentativas e limite de tempo entre uma tentativa e outra. Leia mais sobre Sess. Hijacking: http://tinyurl.com/mais-sobre-brute-force
  35. Rainbow Table O que é? Semelhante ao ataque de força bruta, porém diretamente a um hash (md5, sha1, etc). Como ocorre? É a mistura de um ataque de força bruta com um ataque de dicionário. De posse do hash, o invasor utiliza este ataque para testar combinações que possam gerar o hash procurado até que se chegue à resposta correta.
  36. Rainbow Table Exemplo Caso o usuário malicioso obtenha acesso aos hashs de senha (apenas visualizar), ele ainda assim terá de descobrir a senha que está ali. O problema está em confiar apenas na criptografia de hashs comuns como md5 e sha1 .
  37. Rainbow Table Exemplo Vamos pegar como exemplo a palavra abacaxi . O hash md5 referente é 4b96d5c1ff312eea069ddc760794963d . Supondo que obtemos este hash do banco de dados, basta digitá-lo no Google e em alguns segundos estamos prontos.
  38. Rainbow Table Exemplo
  39. Rainbow Table Como evitar A técnica mais utilizada e que reduz drasticamente a chance de este ataque dar certo, é “temperar” suas senhas. Ao inserir uma string arbitrária antes de criptografar a senha, este ataque torna-se praticamente inefetivo. À essa string arbitrária damos o nome de salt .
  40. Rainbow Table Como evitar Digamos que seu salt será rocknroll . Ao aplicar a criptografia na sua string, você deverá concatenar com o seu salt. md5("rocknroll" . $senha) Se a senha for abacaxi teremos o seguinte hash: 0a5cefae5c742e8a914f486db9ea45ef . E pra esse o Google não tem resposta! 😉 Leia mais sobre Rainbow Table: http://tinyurl.com/mais-sobre-rainbow-table
  41. Password Sniffing O que é? Este ataque baseia-se em capturar na rede um pacote descriptografado com os dados de autenticação de algum usuário. Como ocorre? Monitorando a rede pode-se visualizar todos os pacotes. Todas as requisições via POST e GET normalmente estão abertas à visualização.
  42. Password Sniffing Como evitar Proteja a sua conexão com SSL. Utilizando este protocolo você irá assegurar que a comunicação entre o cliente e o servidor, mesmo que interceptada, não possa ser decifrada. Utilize sempre o POST (por ser uma forma mais segura) e lembre-se de sempre colocar o protocolo HTTPS .
  43. Password Sniffing Como evitar Você pode também redirecionar o usuário para a página de login (o formulário em si) sempre com HTTPS. Não existe nenhuma razão técnica para isso, apenas psicológica. O usuário costuma sentir-se mais seguro quando está colocando sua senha em uma página com cadeado. 🙂 Leia mais sobre Sniffing: http://tinyurl.com/mais-sobre-sniffing
  44. Outros tipos de ameaça 3
  45. Outros tipos de ameaça
    • Includes
    • Abuso de formulários
    • Diretrizes (register_globlals, display_errors, etc)
    • Exposição do phpinfo

    Existem outras ameaças que vão além da alçada do programador. Outras podem ser evitadas se alguns cuidados forem tomados.

  46. Outros tipos de ameaça
    • A inclusão de arquivos via include() e require() , embora muito útil, pode ter consequencias muito ruins se não utilizada corretamente.
    • É muito comum a inclusão de arquivos recebidos via URL sem que a string seja filtrada.

    Includes

  47. Outros tipos de ameaça
    • Outro ponto que você deve estar atento é quanto ao uso de extensões que o seu servidor web não “conheça”.
    • Evite extensões do tipo .inc . Se for fazê-lo, prefira algo do tipo meuarquivo.inc.php .

    Includes

  48. Outros tipos de ameaça
    • Funções que você pode utilizar para filtrar os dados recebidos e evitar um ataque de XSS ou a exposição do seu código:
    • basename()
    • file_exists()

    Includes

  49. Outros tipos de ameaça
    • Esteja sempre atento ao uso de seus formulários.
    • O maior erro que você pode cometer é colocar os possíveis e-mails dentro do seu formulário.
    • Isto abrirá uma brecha em que o usuário mal intencionado poderá inserir endereços arbitrários e utilizar o seu formulário como disseminador de SPAM.

    Abuso de formulários

  50. Outros tipos de ameaça
    • Algumas diretrizes, quando bem configuradas, podem aumentar a segurança da sua aplicação.
    • register_globals
    • display_errors
    • log_errors

    Diretrizes

  51. Outros tipos de ameaça
    • É incrível o número de páginas espalhadas pela web que possuem um arquivo phpinfo.php em sua raiz.
    • A primeira ação tomada por um usuário mal intencionado é verificar a existência desse arquivo e de variantes do seu nome como info.php , php.php , etc.

    Exposição do phpinfo

  52. Mais alguns cuidados 4
  53. Mais alguns cuidados
    • Lei do menor privilégio (SQL)
    • Ocultação de cabeçalhos HTTP
    • Examine sempre os logs

    Existem mais alguns cuidados que você pode tomar para assegurar que será mais difícil conseguir realizar um ataque bem sucedido contra a sua aplicação.

  54. Mais alguns cuidados Lei do menor privilégio (SQL) Sempre que possível, crie mais de um usuário para acesso ao banco de dados. Não é uma boa idéia utilizar o usuário administrador (root) para acessar o banco através do site.
  55. Mais alguns cuidados Lei do menor privilégio (SQL) Crie usuários que só tenham permissão de leitura e usuários que só tenham permissão de escrita . Caso, devido a algum infortuno do destino, alguém consiga invadir o seu sistema terá apenas permissões limitadas.
  56. Mais alguns cuidados Ocultação de cabeçalhos HTTP Sempre que você acessa uma página, o servidor envia cabeçalhos HTTP para o seu browser. Dentro deste cabeçalhos podemos encontrar algumas informações interessantes.
  57. Mais alguns cuidados Ocultação de cabeçalhos HTTP
  58. Mais alguns cuidados Ocultação de cabeçalhos HTTP Dentro do arquivo httpd.conf do Apache você pode alterar o nível de exposição da versão das aplicações instaladas no seu servidor. Para tanto, você deve alterar a diretiva ServerTokens .
  59. Mais alguns cuidados Ocultação de cabeçalhos HTTP
    • ServerTokens valor_desejado
    • Prod: Apache
    • Major: Apache/2
    • Minor: Apache/2.0
    • Min: Apache/2.0.59
    • OS: Apache/2.0.59 (Unix)
    • Full: Apache/2.0.59 (Unix) PHP/5.2.6
  60. Mais alguns cuidados Examine sempre os logs Esteja atento aos logs e, se possível, utilize ferramentas de monitoramento de tráfego (como AWStats e Webalizer) para analisar possíveis tentativas de ataque à sua página.

 

 

Quer ler mais sobre PHP?

Ver mais posts sobre PHP