English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Neste tutorial, você aprenderá como corrigir vulnerabilidades comuns em bancos de dados.
SQL injeta é um ataque, onde o atacante pode injetar ou executar código SQL malicioso nos dados inseridos pelo navegador no servidor do aplicativo (por exemplo, entrada de formulário web).
Ele pode ser usado para expor informações sensíveis, como o número de telefone do usuário, endereço de e-mail, informações de cartão de crédito, etc. O atacante até pode usá-lo para contornar o processo de autenticação e obter acesso total ao banco de dados. Vamos ver como isso funciona.
Considere a seguinte instrução SQL, que é um exemplo simples de autenticação de usuário usando nome de usuário e senha em um aplicativo web.
SELECT * FROM users WHERE username='username_val' AND password='password_val';
aqui,username_valepassword_valque representam o nome de usuário e a senha digitados pelo usuário. Se o usuário inserir como nome de usuário "john" e " 123”como senha”, então a instrução resultante será:
SELECT * FROM users WHERE username='john' AND password='123;
Mas suponha que, se o usuário for o atacante, ele não tenha digitado um nome de usuário e uma senha válidos nos campos de entrada, mas valores semelhantes aos seguintes: ' OR 'x'='x
Neste caso, a consulta SQL mencionada acima será construída da seguinte forma:
SELECT * FROM users WHERE username='' OR 'x'='x' AND password='' OR 'x'='x';
Esta instrução é uma instrução SQL válida, pois WHERE 'x'='x' sempre é true, portanto, a consulta retornaráusersTodas as linhas da tabela. Você pode ver que o atacante pode acessar facilmente todas as informações sensíveis do banco de dados com uma pequena técnica.
seusersSe a tabela for grande e contiver milhões ou mais linhas, essa única instrução ainda pode causar um ataque de negação de serviço (DoS) ao sobrecarregar os recursos do sistema, tornando seu aplicativo inacessível para usuários legítimos.
Aviso:Se seu script gerar umDELETEouUPDATESe a consulta for executada, ignorar as consequências da vulnerabilidade de injeção SQL pode ser ainda pior. Os atacantes podem excluir dados da tabela ou alterar permanentemente todas as linhas.
Sempre verifique a entrada do usuário, não faça suposições. Não construa diretamente instruções SQL a partir da entrada do usuário. Se você estiver usando PHP e MySQL, você pode usar a função mysqli_real_escape_string() para criar strings SQL válidas que podem ser usadas em instruções SQL.
Este é um exemplo muito básico de autenticação de usuário usando PHP e MySQL, que demonstra como evitar a injeção SQL ao obter entrada do usuário.
<?php // Starting session session_start(); /* Tente conectar ao servidor MySQL Presumindo que você esteja executando o servidor MySQL com configurações padrão (o usuário 'root' não tem senha) */ $link = mysqli_connect("localhost", "root", "", "demo"); // Verifique a conexão if($link === false){ die("Erro: Não foi possível conectar ao banco de dados."); } // Escapar a entrada do usuário para garantir a segurança $username_val = mysqli_real_escape_string($link, $_POST['username']); $password_val = mysqli_real_escape_string($link, $_POST['password']); if(isset($username_val, $password_val)){ // Tente escolher a execução da consulta $sql = "SELECT * FROM users WHERE username='" . $username_val . "' AND password='" . $password_val . ""; if($result = mysqli_query($link, $sql)){ if(mysqli_num_rows($result) == 1{ // O usuário foi autenticado, por favor, faça a operação aqui $row = mysqli_fetch_array($result); /*Salvar os valores nas variáveis de sessão para que possa ser referenciado mais tarde na mesma referência de sessão */ $_SESSION['user_id'] = $row['user_id']; $_SESSION['first_name'] = $row['first_name']; header('Location: welcome.html'); } echo "Erro! Nome de usuário ou senha inválidos."; } } echo "Erro: algo deu errado. Tente novamente."; } } // Fechar Conexão (Close connection) mysqli_close($link); ?>
Dica:Testar o tamanho e o tipo ou conteúdo dos dados recebidos pelo aplicativo de teste, e implementar limites apropriados para evitar o uso indevido dos recursos do sistema.