Blindando O Seu Codigo Em PHP
Artigos Científicos: Blindando O Seu Codigo Em PHP. Pesquise 862.000+ trabalhos acadêmicosPor: arnaldofjr • 9/5/2013 • 1.418 Palavras (6 Páginas) • 495 Visualizações
Um programador tem que ser desconfiado, sempre esperar o pior, do usuário e principalmente de outros programadores. O mundo dos bits tem suas hienas à espreita para sugar todos os dados do seu website e depois te deixar com uma dor de cabeça das mais violentas.
Nos ataques, conhecidos como injeção de código e sql injection o objetivo é se aproveitar de possíveis brechas de segurança no seu script e inserir instruções que darão acesso ao invasor, a todas as informações do seu banco de dados. E não é porque você não fez um website para uma multinacional ou portal que não precisa se preocupar com ataques. Os scripts de ataque não procuram por tamanho do website, mas por dados.
As duas modalidades mais comuns nas tentativas de injeção de código são através de formulários e urls. Sendo assim você deve se preocupar tanto em validar as informações inseridas pelo usuário, como a estrutura das suas páginas e como os dados são passados entre elas.
O PHP fornece uma ampla gama de funções para validação de dados. Vamos conhecê-las e aprender a tornar nossos scripts verdadeiras fortalezas.
Cofre
Injeção De Código Na URL
A criação de urls amigáveis por si só já ajuda a evitar esse tipo de ataque. Ele altera os valores das variáveis que são passados de uma página para outra.
Um exemplo comum é quando são listados os produtos à venda no website. Em uma página são mostradas somente a foto e o preço, ao clicar sobre eles é passada a “id” correspondente para outra página que mostra os detalhes. A url no caso fica assim:
http://www.site.com/descricao.php?id=10
A consulta é essa:
<?php
$id = $_GET[‘id’] //10
$busca = mysql_query(“SELECT * FROM produtos WHERE id=’$id’”);
// $busca = mysql_query(“SELECT * FROM produtos WHERE id=10”);
?>
Mas o invasor deseja ver mais que apenas os detalhes do produto. Então ele se utiliza de uma SQL-Injection clássica, e altera o endereço para pesquisa:
http://www.site.com/descricao.php?id=’ OR 1=1
Veja o que ocorre devido à falta de validação:
<?php
$id = $_GET[‘id’] //’ OR 1=1
$busca = mysql_query(“SELECT * FROM produtos WHERE id=’$id’”);
// $busca = mysql_query(“SELECT * FROM produtos WHERE id=’’ OR 1=1”);
?>
A consulta não vai encontrar o “id” vazio, mas considera que 1 é igual a 1. E como estamos falando de lógica, ela vai ser considerada verdadeira e vai retornar todos os registros da tabela! E se ao invés da tabela produtos fosse a tabela usuários? Imaginou o tamanho do problema?
Se Protegendo Com O filter_var
É muito simples se proteger contra esse ataque. Como os valores das ids são números, é só garantir que o valor passado seja numérico, pois as tentativas de SQL-Injection sempre utilizam strings.
<?php
$id = $_GET[‘id’] ;// ‘ OR 1=1
$id = filter_var($id, FILTER_SANITIZE_NUMBER_INT); //resulta em 11
?>
Simples, não? A função só deixou número e nossa consulta vai ocorrer como o esperado.
A função filter_var é uma grande facilitadora nas validações. Ela só precisa que você informe qual variável será analisada, o que você quer checar e se existe alguma ressalva.
A sintaxe simplificada da função é esta:
filter_var ($variable, $filter, $options)
Com ela você pode validar também endereços de e-mail, ips, floats, urls, caracteres especiais. Uma função bastante versátil. Veja mais sobre ela na documentação do PHP (http://docs.php.net/manual/pt_BR/function.filter-var.php)
int()
Mas se você quer permitir somente números como valor da variável, o código fica desta maneira:
<?php
$id = (int)$_GET[‘id’] ;// ‘ OR 1=1
echo $id // 0
?>
Como o valor passado é uma string, na tentativa de conversão o resultado será nulo, ou numericamente 0. E problema resolvido!
Para tornar o prejuízo menor, você também pode limitar o retorno das consultas com o LIMIT.
Acima trabalhamos apenas em garantir que estamos recebendo um número. E é consideravelmente mais fácil do que garantir que a string que nós esperamos é a que esta sendo passada. Vamos ao trabalho.
Validando Strings
Você possui um blog onde posta suas idéias e repassa conhecimento. Tem espaço para comentários. Tudo muito democrático. Você acredita na boa intenção das pessoas e não se preocupa em validar os dados (ou seria preguiça?). Então vem um desocupado e resolve comentar nos seus artigos inserindo um link para a página dele esperando melhorar de posição nas pesquisas do Google. E depois desse vem outro e mais outro. Fazem uma festa nos comentários.
htmlspecialchars() e htmlentities()
Para dar um jeito nestes fanfarrões você pode bloquear os caracteres HTML que são inseridos nos comentários. Para isso existe a função htmlspecialchars().Ela converte caracteres que possuem significado para o HTML (&, “, ‘,). Ele transforma, por exemplo, aspas duplas em " . A sintaxe é
htmlspecialchars($string, $quote_style, $charset,
...