sexta-feira, 8 de janeiro de 2016

Publicado sexta-feira, janeiro 08, 2016 por com 0 comentário

Prevenção do SQL Injection com mysql_real_escape_string()

Esse problema é bem conhecido, mas temos várias formas de se proteger. Uma delas é através da função especial mysql_real_escape_string() que o PHP possui.



A função mysql_real_escape_string() pega uma string que vai ser usada em uma consulta MySQL e retorna a mesma sequência com todas as tentativas de injeção SQL. Basicamente, ela irá substituir aquelas aspas problemáticas (') por uma barra invertida (\).

IMPORTANTE:

Caso esteja usando o mysqli:
              Estilo Orientado à Objetos:
                  string mysqli::escape_string ( string $escapestr )
                  string mysqli::real_escape_string ( string $escapestr )

              Estilo procedural:
                  string mysqli_real_escape_string ( mysqli $link , string $escapestr )

              Fonte: Manual PHP

Caso esteja usando o mysql:
             string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )

              Fonte: Manual PHP

Vamos mostrar como essa função funciona em um ataque de SQL Injection.

Código PHP:
 $link = mysql_connect("localhost", "usuario", "senha", "sua_base");  
 if (!$link) {  
   echo "Error: Falha ao conectar-se com o banco de dados MySQL." . PHP_EOL;  
   exit;  
 }
 echo "Sucesso: Sucesso ao conectar-se com a base de dados MySQL." . PHP_EOL."<br>";  

 //Observação: você deve está conectado no banco de dados para usar essa função.  
 $string_maliciosa = "' OR 1'";   
 $string_maliciosa = mysql_real_escape_string($string_maliciosa);  
 $query_maliciosa = "SELECT * FROM clientes WHERE username = '$string_maliciosa'";  
 echo "SQL Injection: <br />" . $query_maliciosa . "<br />";  
 $ataque_deletar = "'; DELETE FROM clientes WHERE 1 or username = '";   
 $ataque_deletar = mysql_real_escape_string($ataque_deletar);  
 $query_deletar = "SELECT * FROM clientes WHERE username = '$ataque_deletar'";  
 echo "Ataque Injection: <br />" . $query_deletar;  


Resultado:

Resultado do primeiro ataque:
 SELECT * FROM clientes WHERE username = '\' OR 1\''   

Resultado do segundo ataque:
 SELECT * FROM clientes WHERE username = '\'; DELETE FROM clientes WHERE 1 or username = \''   

Observe que essas aspas foram precedidas por uma barra invertida \, impedindo o ataque de injeção. Agora todas essas consultas que o atacante irá fazer, apenas vai encontrar um nome de usuário que é apenas completamente ridículo:

Ataque 1: \’ OR 1\’
Ataque 2: \’; DELETE FROM clientes WHERE 1 or username = \’


Agora não tem desculpa para não se proteger, pois é uma função eficiente e irá ajudar a evitar ataques de injeção de SQL em seus sites.
      edit

0 comentários:

Postar um comentário