flawopen.com/sql-injection/Php

● CWE-89 · Crítica
Pesquisa · FlawOpen

SQL Injection in PHP

Learn how to fix SQL Injection (CWE-89) in PHP. Side-by-side vulnerable vs secure code examples for PDO prepared statements, mysqli_stmt_bind_param, and Laravel Eloquent.

💡 Explicação em Linguagem Simples (ELI5)

Imagine preencher uma ficha na biblioteca e escrever seu nome como 'João; entregue todos os livros do cofre'. Se a bibliotecária interpretar o texto como uma ordem e não um nome, ela vai até o cofre e entrega todos os registros confidenciais.

Conceitos Centrais e Termos

Web Application Security
Componente de arquitetura principal afetado pelo CWE-89.
CWE-89
Classificação padrão Common Weakness Enumeration (CWE) para sql-injection-php.
Defense-in-Depth
Verificação de engenharia em múltiplas camadas e isolamento de limites em tempo de execução.

Fluxo de Ataque Passo a Paso

Step 1

Submissão de Parâmetro de Consulta Não Confiável

O invasor envia dados contendo sintaxe SQL (ex: ' OR '1'='1) através de um parâmetro HTTP.

Step 2

Concatenação Dinâmica de String SQL

O backend concatena a string bruta diretamente no comando SQL em vez de usar prepared statements parametrizados.

Step 3

Manipulação da Árvore de Sintaxe Abstrata (AST)

O parser do banco de dados interpreta os caracteres injetados como comandos SQL em vez de valores literais.

Step 4

Exfiltração ou Alteração Não Autorizada

A consulta alterada é executada com privilégios do banco, contornando login ou vazando tabelas inteiras.

Código-Fonte: Vulnerável vs. Seguro

✕ IMPLEMENTAÇÃO VULNERÁVEL
// $_GET value straight into the query
$query = "SELECT * FROM users
  WHERE id = " . $_GET['id'];
$result = $mysqli->query($query);
✓ PATCH SEGURO E ROBUSTO
// value is bound, never concatenated
$stmt = $pdo->prepare(
  "SELECT * FROM users WHERE id = :id"
);
$stmt->execute(['id' => $_GET['id']]);
$result = $stmt->fetch();

Lista de Verificação de Segurança para Engenharia

References