quinta-feira, 22 de setembro de 2011

Como evitar ataques de SQL Injection no PHP e MySQL

A melhor função para proteger sistemas em PHP e MySQL contra SQL Injection é a mysql_real_escape_string(). Ela faz escapar os caracteres especiais, como aspas simples e duplas, antes de enviar para o banco de dados.

Esta função não funciona em todas as versões do PHP, então devemos verificar se ela existe, e caso não exista, utilizar a função mysql_escape_string().

Também devemos ter em mente que se a diretiva get_magic_quotes_gpc() está ligada ela acrescenta barras invertidas automaticamente antes de aspas simples e duplas. O problema é que ela envia para o banco de dados com as barras invertidas, estragando o texto. Para contornar isso usamos a função stripslashes() para remover essas barras invertidas.

Então vamos montar a nossa função com o nome de anti_sql_injection():

function anti_sql_injection($str) {
     if (!is_numeric($str)) {
          $str = get_magic_quotes_gpc() ? stripslashes($str) : $str;
          $str = function_exists('mysql_real_escape_string') ? mysql_real_escape_string($str) : mysql_escape_string($str);
          }
     return $str;

Note que em nossa função primeiro verificamos se o valor informado não é numérico, ou seja, que precisa ser tratado. Em seguida verificamos se a diretiva get_magic_quotes_gpc() está ativada. Se estiver usamos a função stripslashes(). Em seguida verificamos se existe a função mysql_real_escape_string(). Se existir usamos ela, caso contrário, usamos a função mysql_escape_string().

Veja um exemplo de como usar a função:

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
     $usuario = trim($_POST['POST']);
     $senha = trim($_POST['senha']);

     $sql = 'SELECT COUNT(id_usuario) ';
     $sql .= 'FROM usuarios ';
     $sql .= 'WHERE usuario = \'' . anti_sql_injection($usuario) . '\' ';
     $sql .= 'AND senhha = \'' . anti_sql_injection($senha) . '\' ';
     $query = mysql_query($sql) or die('Erro na consulta: ' . mysql_error());
     $total = mysql_result($query, 0);
     if ($total > 0) {
          echo 'Usuário e senha corretos.';
     } else {
          echo 'Usuário e/ou senha inválido(s).';
     }

Pronto! Estamos vacinados contra ataques de SQL Injection.

Ligue a vontade para qualquer celular ou fixo em todo o Brasil, EUA e Canadá, através do 99TelexFREE. Teste nosso serviço por 1 hora gratuitamente: http://www.telexfree.com/ad/marcelmesmo 

0 comentários:

Postar um comentário