Back-End

24 jun, 2010

SQL Injection com PHP

Publicidade

O que é o
SQL Injection?

O SQL
Injection é uma forma e ataque ao banco de dados feito através das URLs ou mesmo
dos formulários de registo.

Esta
vulnerabilidade permite ao “hacker” fazer consultas no banco de dados inserindo comandos
SQL no URL e em formulários obtendo assim informação sobre utilizadores e
passwords do site, transformando aquilo que à partida pode parecer protecção
numa porta de entrada para os dados.

Uma das
formas de perceber se o sistema está ou não protegido contra SQL Injection é
colocar uma plica (aspas simples) a seguir a um URL com referência a uma
variável que é passada. Por exemplo:

http://www.site.com/result.php?ref=54

 

Caso o
retorno seja um erro então estamos perante um site que permite o SQL Injection
e por isso mesmo um sistema em perigo de ataque.

Neste caso
poderemos fazer uma consulta à base de dados através da URL ou mesmo de um
formulário, e que, obviamente, não vou demonstrar como se faz.

 

Como evitar
o SQL Injection?

Existem
diversas formas de evitar o SQL Injection num sistema com banco de dados, uns
mais complexos que outros, mas o importante é proteger o banco de dados de um
ataque.

Uma das
funções que protegem o sistema do SQL Injection é a mysql_real_escape_string().
Esta função substitui os caracteres problemáticos, como aspas ou plicas (‘),
antes de enviar a informação à base de dados. Mas esta função tem um pequeno
problema que é não funcionar com todas as versões do PHP, podendo ser
substituída pela função mysql_escape_string().

Então e qual
delas utilizar?

Uma vez que
a primeia é mais eficiente, mas não funciona em todas as versões, e a segunda
não é tão eficiente, mas funciona com todas as versões, devemos fazer uma
função que detecte a existência da função mysql_real_escape_string(), caso esta
existe vai utiliza-la, caso contrário utilizará a mysql_escape_string().

 

Também devemos ter em atenção que se a funçao
get_magic_quotes_gpc() estiver activa irá acrescentar barras invertidas antes
das plicas e aspas. Isto torna-se um problema pois serão enviadas para o banco
de dados texto com barras invertidas. Para contornar esta situação utilizamos a
função stripslashes() que removerá essas barras.

function antiSQLinjection($string)
{
$string = get_magic_quotes_gpc() ? stripslashes($string) : $string;

$string = functionExists(“mysql_real_escape_string”) ? mysql_real_escape_string($string) : mysql_escape_string($string);

return $string;
}

Utilizando a função:

mysql_quey(“SELECT user, pass FROM users WHERE user = ‘” . antiSQLinjection($_POST[‘user’]) . “‘ AND pass = ‘” . antiSQLinjection($_POST[‘password’]) . “‘”);

Abraço,

Paulo Barbosa da Silva

www.code2u.net