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); ?>