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:
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
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