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.
0 comentários:
Postar um comentário