O SQL Injection (Injeção de SQL) é um tipo de ameaça de segurança que se aproveita de falhas em sistemas que interagem com bases de dados via SQL. Neste post veja SQL Injection em PHP.

A injeção de SQL ocorre quando o atacante consegue inserir uma série de instruções SQL dentro de uma consulta (query) através da manipulação das entradas de dados de uma aplicação.

O exemplo abaixo mostra uma vulnerabilidade em um código no qual é possível injetar comandos SQL através da URL:

 /* Se existir id (se usuário passou alguma coisa), 
 mantém o que ele passou ($_GET["id"]), caso contrário, adote 1 */
 $id = (isset($_GET["id"]))?$_GET["id"]:1;
 
 $conn = mysqli_connect("localhost", "root", "", "meuBanco");
 
 $sql = "SELECT * FROM tb_usuarios WHERE idusuario = $id";
 
 /* O problema do parâmetro $id é que o mesmo vem de uma URL, o que pode ser 
 manipulado */
 
 $exec = mysqli_query($conn, $sql);
 
   while($result = mysqli_fetch_object($exec)) {
  
  //Mostra o valor do campo "CPF"
  echo $result->CPF . "<br>";
  echo var_dump($result);
  
  //A função var_dump() exibe todas as informações do usuário

Ao passar o parâmetro $id via URL é possível informar junto uma instrução SQL para mostrar todas as informações dos usuários, por exemplo:

http://criandobits.com.br/seguranca/exemplo-02.php?id=5 OR 1 = 1 —

A URL acima, além de passar o valor 5 para o parâmetro $id, passa a instrução OR 1 = 1 — que significa “condição sempre verdadeira (OR 1 = 1)” e ignora qualquer outra instrução SQL que venha depois (–).

Para corrigir a vulnerabilidade acima, será feito o tratamento das informações recebidas:

 $id = (isset($_GET["id"]))?$_GET["id"]:1;
 
 /* Se o parâmetro recebido não for numérico ou 
 se for uma string com mais de 6 caracteres... */
 if(!is_numeric($id) || strlen($id) > 6) {
  exit ("Ops, pegamos você, safadinho! kkk");
 }
 
 $conn = mysqli_connect("localhost", "root", "", "dbphp7");
 
 $sql = "SELECT * FROM tb_usuarios WHERE idusuario = $id";

 $exec = mysqli_query($conn, $sql);
 
 while($result = mysqli_fetch_object($exec)) {
 
 echo var_dump($result);

Acima, se for atribuido uma string (que pode ser um comando SQL) para o parâmetro $id (!is_numeric($id)) ou uma string com mais de 6 caracteres (o que pode representar um comando SQL), o programa finalizará (exit()).

A melhor forma de evitar ataques é usar boas práticas nos comandos SQL: tudo que for comparado, usar aspas, pois o próprio PHP já trata tudo que vem dentro das aspas como string e, principalmente, o uso do PDO com os binds params.

QUER APRENDER PHP ORIENTADO A OBJETOS OU APERFEIÇOAR O QUE JÁ SABE?

Então conheça o curso online que já ajudou milhares de pessoas a aprender a programar e desenvolver seus próprios projetos do ZERO e usando orientação a objetos de uma forma fácil de entender.

CLIQUE NA IMAGEM ABAIXO E SAIBA MAIS:

CLIQUE AQUI E SAIBA MAIS

Dúvidas ou sugestões sobre SQL Injection em PHP? Deixem nos comentários! Para mais dicas, acesse o nosso canal no YouTube:
https://youtube.com/criandobits

Tags: |

Quer receber GRÁTIS o e-book "Como Formatar um Computador em 5 Minutos"?

Não enviamos spam. Seu e-mail está 100% seguro!

Sobre o Autor

Bene Silva Júnior
Bene Silva Júnior

Bacharel em Sistemas de Informação pelo Instituto Paulista de Pesquisa e Ensino IPEP. Apaixonado por tecnologias e games do tempo da vovó!

0 Comentários

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *