SQL Injection

Definição

SQL Injection é um tipo de ataque que ocorre quando comandos SQL maliciosos são inseridos em campos de entrada da aplicação, com o objetivo de manipular consultas ao banco de dados.

Esse ataque é possível quando a aplicação não valida ou não trata corretamente os dados enviados pelo usuário, permitindo que comandos inesperados sejam executados.

Consequências possíveis:

  • Vazamento de dados sensíveis;
  • Modificação ou exclusão de dados;
  • Bypass de autenticação;
  • Comprometimento total do banco de dados.

Objetivos da Prevenção de SQL Injection

  • Proteger o banco de dados contra comandos não autorizados enviados por usuários mal-intencionados.
  • Garantir a integridade e confidencialidade dos dados.
  • Evitar falhas de segurança que permitam acesso indevido a credenciais, dados financeiros ou informações confidenciais.
  • Cumprir boas práticas e requisitos de conformidade, como OWASP Top 10, PCI-DSS e LGPD.

Exemplo de ataque SQL Injection

Suponha o seguinte código em Python (inseguro):

usuario = input("Usuário: ")
senha = input("Senha: ")

query = f"SELECT * FROM usuarios WHERE usuario = '{usuario}' AND senha = '{senha}'"

Se o atacante digitar como nome de usuário:

'admin' OR '1'='1

A consulta gerada será:

SELECT * FROM usuarios WHERE usuario = 'admin' OR '1'='1' AND senha = '...'

Isso é perigoso porque a expressão '1'='1' é sempre verdadeira, e devido à precedência dos operadores, a consulta pode ser interpretada como:

usuario = 'admin' OR ('1'='1' AND senha = '...').

Se o nome de usuário 'admin' existir, o banco pode retornar esse usuário mesmo com a senha incorreta, burlando a autenticação. Assim, o hacker consegue acesso sem precisar da senha real.

Como prevenir

  • Use consultas parametrizadas (prepared statements): a forma mais eficaz de evitar SQL Injection.

  • Valide e sanitize todos os dados de entrada.

  • Evite concatenar strings diretamente em consultas SQL.

  • Limite privilégios do usuário do banco de dados.

  • Monitore e registre atividades suspeitas no banco.

Exemplo seguro — usando parâmetros com SQLite (Python)

import sqlite3

conn = sqlite3.connect('banco.db')
cursor = conn.cursor()

usuario = input("Usuário: ")
senha = input("Senha: ")

# Consulta segura com parâmetros

cursor.execute("SELECT \* FROM usuarios WHERE usuario = ? AND senha = ?", (usuario, senha))
resultados = cursor.fetchall()

if resultados:
print("Login bem-sucedido.")
else:
print("Usuário ou senha inválidos.")

O ciclo da proteção contra SQL Injection


[Entrada do usuário] → [Validação e sanitização] → [Consulta parametrizada] → [Resposta segura do banco]
  • Toda entrada deve ser tratada como potencialmente maliciosa.

  • O banco só deve executar o que foi explicitamente previsto pela aplicação.

Relacionados

Política de Privacidade

Copyright © www.programicio.com Todos os direitos reservados

É proibida a reprodução do conteúdo desta página sem autorização prévia do autor.

Contato: programicio@gmail.com