P@P admin blog

Blog do administrador da comunidade Portugal-a-Programar

SQL Injection – breve explicação

Tenho tido muito tempo livre nestas férias, pelo que decidi aproveitá-lo devidamente a estudar programação. Tenho vários projectos importantes em mãos, que envolvem a utilização da linguagem PHP que já estudo há cerca de 6 meses e com a qual já estou minimamente familiarizado. Posso dizer que neste momento, podem pedir-me para fazer qualquer coisa nessa linguagem que eu, com mais ou menos estudo prévio, consigo fazê-lo.

Nas últimas semanas tenho estudado dois temas mais específicos da linguagem: Programação Orientada a Objectos e Segurança.

Hoje, venho falar-vos um pouco da segurança em PHP, nomeadamente de SQL Injection, um método muito falado mas também muito fracamente compreendido pelas massas. Ora, para muitos programadores, SQL Injection é uma daquelas coisas que todos sabem que é mau, mas o conhecimento do método não passa disso. Ouve-se muitas vezes a expressão vinda de técnicos de segurança e associa-se imediatamente a algo mau, mas nunca se sabe exactamente o que é, nem como se evitar.
Este artigo tem, portanto, um objectivo duplo:

  •  ensinar como identificar uma vulnerabilidade que pode ser aproveitada com métodos SQL Injection;
  • ensinar como salvaguardar o vosso código contra ataques SQL Injection.

Como identificar uma vulnerabilidade SQL Injection?

Esta é, nos casos mais simples, uma tarefa realmente fácil. Sempre que o utilizador tiver que introduzir dados como um parâmetro numa consulta á base de dados, existe a possibilidade de SQL Injection. Como exemplo, vamos supor que a seguinte consulta é usada para verificar um nome de utilizador/password:

$query = “SELECT * FROM users WHERE utilizador=’{$_POST[’utilizador]}’ AND password=’{$_POST[’password’]}’”;

Normalmente, o programador assume que o utilizador, perante o formulário, introduziria o seu nome de utilizador e a password, mas é aqui que se situa o primeiro erro do programador: confiar nos utilizadores. Ora, se o utilizador em vez de introduzir o seu nome de utilizador e a password, introduzir parte de uma instrução de consulta? Quando se junta toda a instrução, esta seria executada como uma consulta vulgar. Por exemplo, imaginemos que o utilizador introduz “Rui” como nome de utilizador e ” ’OR 1=1′”(reparem nos single quotes) como password. A nossa consulta ficaria assim:

 $query = “SELECT * FROM users WHERE utilizador=’Rui’ AND password=’’ OR 1=1″;

Isto retornaria todos os registos da base de dados, autorizando um cracker a ganhar acesso á nossa aplicação sem necessitar de qualquer nome de utilizador/password válidos.

Como salvaguardar o nosso código contra ataques SQL Injection? 

Agora que compreendem como funciona um ataque via SQL Injection, como devem proteger as vossas aplicações de modo a evitá-los? Em PHP, é na verdade, muito simples. Basta passar os dados $_POST['utilizador'] e $_POST['password'] pela função mysql_real_escape_string() . O que esta função faz é “escapar” os caracteres especiais numa frase para usar numa consulta SQL, levando em conta o conjunto actual de caracteres (os singles quotes, por exemplo, como utilizamos na consulta acima). Usando o exemplo da consulta anterior, o modo correcto de a proteger minimamente contra SQL Injection seria este:

$query = sprintf(”SELECT * FROM users WHERE utilizador=’%s’ AND password=’%s’”,

mysql_real_escape_string($_POST[’utilizador’]),

mysql_real_escape_string($_POST[’password’]));

Como podem ver, proteger as vossas aplicações contra SQL Injection é bastante simples. Espero ter conseguido explicar-vos este pequeno processo devidamente. De qualquer modo, no caso de não terem compreendido algo, espero que questionem sem qualquer problema. 

December 28, 2006 Posted by deathseeker25 | Programação | | 3 Comments