0

Programando PHP de forma segura para evitar SQL injections

criado por Gregory em 19/10/2005 5:54am
Fazer uma busca no banco de dados é algo relativamente simples para quem tem uma pequena noção de SQL.
Deixando de lado por um segundo o PHP, a busca nada mais é do que filtrar uma ou mais tabelas de uma base com determinadas "clausulas". Por exemplo:

SELECT nome FROM tbl_clientes WHERE sexo='m';

(que traria da tabela clientes todos os nomes cujo sexo seja igual a 'm')

Bom agora que passamos desse conceito básico do que é uma busca em banco...

O PHP deixa você interagir com o banco do mesmo jeito que você faria diretamente no banco de dados em si, retornando os valores para o script (isso eu presumo que você também já esteja careca de saber).

O problema aparece exatamente com essa frase óbvia. Porque você me pergunta? Vamos ver um jeito muito comum de fazer uma busca no PHP:

<?php
$sql = "select nome from tbl_clientes WHERE sexo ='".$_GET['sexo']."'";
?>

Aparentemente, isso nao apresenta problemas óbvios para a maioria dos programadores, porém, isso permite uma exploração de uma falaha no seu SQL. Vamos supor, que os e-mails de seus clientes sejam "protegidos" ou privados, e que, em hipótese alguma, alguém fora você deveria ter acesso a eles.

Uma pessoa poderia utilizar um SQL injection para pegar os e-mails:
- Passado um SQL no lugar da variavel "sexo", você pode alterar a forma de agir do sql. Vamos ver como ficaria o SQL para alterar os resultados:

SELECT email as nome from tbl_clientes where sexo like '%'

Agora para que este se enquadre dentro do SQL original adicione algumas coisas para garantir o correto funcionamento do nosso novo sql:

';SELECT email as nome from tbl_clientes where sexo like '%

Assim, quando vc passar isso por GET, seu sql ficaria na verdade assim:

select nome from tbl_clientes WHERE sexo ='';SELECT email as nome from tbl_clientes where sexo like '%'

Seu PHP interpreta esses dois comandos SQL e retorna o segundo. É claro, que isso nao se limita a SELECTS, você poderia facilmente cirar um SQL como DELETE FROM tbl_clientes; por exemplo (será q eu preciso explicar o problema decorrente disso?)

Comentários:

Nenhum comentário foi enviado ainda.

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)