Função mysql_real_escape_string() do PHP

Definição e uso

A função mysql_real_escape_string() escapa os caracteres especiais nas strings usadas nas instruções SQL.

Os seguintes caracteres são afetados:

  • \x00
  • \n
  • \r
  • \
  • '
  • "
  • \x1a

Se for bem-sucedido, essa função retorna a string escapada. Se falhar, retorna false.

Sintaxe

mysql_real_escape_string(string,conexão)
Parâmetros Descrição
string Obrigatório. Especifica a string a ser escapada.
conexão Opcional. Especifica a conexão MySQL. Se não for especificado, usa a conexão anterior.

Descrição

Essa função string caracteres especiais escapados, levando em consideração o conjunto de caracteres da conexão atual, portanto pode ser usado com segurança em mysql_query().

Dicas e comentários

Dica:Pode usar essa função para prevenir ataques ao banco de dados.

Exemplo

Exemplo 1

<?php
$con = mysql_connect("localhost", "hello", "321");
if (!$con)
  {
  die('Não foi possível conectar: ' . mysql_error());
  }
// Código para obter o nome de usuário e a senha
// Escapa o nome de usuário e a senha para uso em SQL
$user = mysql_real_escape_string($user);
$pwd = mysql_real_escape_string($pwd);
$sql = "SELECT * FROM users WHERE
user='" . $user . "' AND password='" . $pwd . "'"
// Mais códigos
mysql_close($con);
?>

Exemplo 2

Ataque ao banco de dados. Este exemplo demonstra o que acontece se não aplicarmos a função mysql_real_escape_string() ao nome de usuário e senha:

<?php
$con = mysql_connect("localhost", "hello", "321");
if (!$con)
  {
  die('Não foi possível conectar: ' . mysql_error());
  }
$sql = "SELECT * FROM users
WHERE user='{$_POST['user']}'
AND password='{$_POST['pwd']}'"
mysql_query($sql);
// Não verifica o nome de usuário e a senha
// Pode ser qualquer conteúdo de entrada do usuário, por exemplo:
$_POST['user'] = 'john';
$_POST['pwd'] = '" OR ''='";
// Alguns códigos...
mysql_close($con);
?>

Então, a consulta SQL ficará assim:

SELECT * FROM users
WHERE user='john' AND password='' OR ''=''

Isso significa que qualquer usuário pode logar sem precisar de uma senha válida.

Exemplo 3

Boa prática para evitar ataques ao banco de dados:

<?php
function check_input($value)
{
// Remover barras
if (get_magic_quotes_gpc())
  {
  $value = stripslashes($value);
  }
// Se não for número, adicionar aspas
if (!is_numeric($value))
  {
  $value = "'" . mysql_real_escape_string($value) . "'";
  }
return $value;
}
$con = mysql_connect("localhost", "hello", "321");
if (!$con)
  {
  die('Não foi possível conectar: ' . mysql_error());
  }
// Realizar SQL seguro
$user = check_input($_POST['user']);
$pwd = check_input($_POST['pwd']);
$sql = "SELECT * FROM users WHERE
user=$user AND password=$pwd";
mysql_query($sql);
mysql_close($con);
?>