SQL Injection é um tipo de ataque onde o atacante injeta código SQL malicioso em uma consulta através de uma entrada vulnerável.
Esse ataque pode permitir ao atacante manipular o banco de dados, como modificar a Tabela X ou atualizar a Tabela Y.
Muitos bancos de dados utilizam SQL (Structured Query Language) para gerenciar e consultar os dados. O atacante injeta código SQL em um campo vulnerável, o que permite executar consultas indesejadas no banco de dados. Por exemplo, um campo de busca vulnerável em um site pode ser explorado para realizar uma consulta maliciosa.
Considere o exemplo do site netcattest.com/busca
. Toda vez que alguém pesquisa por uma aula, é feita uma consulta para retornar o conteúdo. Se o campo de pesquisa for vulnerável, o atacante pode injetar código SQL para manipular o banco de dados.
SELECT * FROM aulas WHERE aula = '45';
Se o atacante injetar ' OR '1'='1'; --
, a consulta se transforma em:
SELECT * FROM aulas WHERE aula = '' OR '1'='1'; --';
Isso faz com que todas as linhas da tabela aulas
sejam retornadas, independentemente do número da aula.
Tabela de Exemplo:
Tabela aulas
:
id | aula | nome |
---|---|---|
1 | 45 | SQL Injection |
2 | 46 | Modificando Query SQL Injection |
Na aula 15, falamos sobre as camadas de um sistema. O banco de dados está localizado na camada 3, junto com o back-end, e sua função é armazenar informações que se relacionam entre si. O back-end utiliza linguagens de programação como PHP ou Java para se comunicar com o banco de dados.
Tabela clientes
:
id | nome | endereço | cidade | idade |
---|---|---|---|---|
1 | Martins | Rua A, 123 | São Paulo | 30 |
2 | Maria | Av. B, 456 | Rio | 25 |
3 | Daniel | Rua C, 789 | New York | 35 |
4 | Ana | Av. D, 012 | New York | 28 |
Comandos SQL de Exemplo:
SELECT:
SELECT aula, nome FROM aulas WHERE aula = '45';
UNION: Utilizado para unir o resultado de 2 ou mais consultas.
SELECT nome, endereço FROM clientes
WHERE cidade = 'São Paulo'
UNION
SELECT nome, endereço FROM clientes
WHERE cidade = 'Rio';
DISTINCT: Retorna apenas valores únicos.
SELECT DISTINCT cidade FROM clientes;
UNION ALL: Retorna resultados com repetições e é mais rápido que o UNION normal.
SELECT nome, endereço FROM clientes
WHERE cidade = 'São Paulo'
UNION ALL
SELECT nome, endereço FROM clientes
WHERE cidade = 'Rio';
OR: Retorna registros que atendem a pelo menos uma das condições.
SELECT nome, endereço FROM clientes WHERE
cidade = 'New York' OR idade = 30;
AND: Todas as condições devem ser satisfeitas.
SELECT nome, endereço FROM clientes WHERE
cidade = 'New York' AND idade > 30;
Elemento SQL | Tipo |
SELECT | Verbo (Comando SQL) |
FROM | Cláusula |
WHERE | Cláusula |
AND | Operador Lógico |
OR | Operador Lógico |
UNION | Operador de Conjunto |
UNION ALL | Operador de Conjunto |
DISTINCT | Modificador |
ORDER BY | Cláusula |
GROUP BY | Cláusula |
HAVING | Cláusula |
JOIN | Cláusula |
LEFT JOIN | Cláusula |
RIGHT JOIN | Cláusula |
FULL JOIN | Cláusula |
ON | Cláusula |
LIKE | Operador |
IN | Operador |
BETWEEN | Operador |
NOT | Operador Lógico |
EXISTS | Operador |
CASE | Modificador |
LIMIT | Cláusula |
OFFSET | Cláusula |
Sintaxe geral de uma consulta SQL
SELECT [MODIFICADOR] coluna1, coluna2, ... FROM tabela [JOIN outra_tabela ON condição] WHERE condição [AND | OR condição] GROUP BY coluna HAVING condição ORDER BY coluna [ASC | DESC] LIMIT quantidade OFFSET quantidade; |
Elemento | Descrição |
---|---|
SELECT |
Seleciona dados da tabela. |
MODIFICADOR | DISTINCT (remove duplicados), TOP (limita a quantidade de registros em alguns bancos de dados). |
FROM |
Especifica a tabela de onde os dados serão selecionados. |
JOIN | Permite combinar dados de múltiplas tabelas (INNER JOIN , LEFT JOIN , RIGHT JOIN , FULL JOIN ). |
ON |
Define a condição para a junção de tabelas no JOIN . |
WHERE |
Filtra os resultados da consulta com base em uma condição. |
Operadores Lógicos | AND , OR , NOT (usados no WHERE para combinar condições). |
GROUP BY |
Agrupa registros com base em uma coluna. |
HAVING |
Filtra os grupos de registros após o GROUP BY . |
ORDER BY |
Ordena os resultados (ASC = crescente, DESC = decrescente). |
LIMIT |
Define o número máximo de registros retornados. |
OFFSET |
Define um deslocamento no conjunto de resultados. |
Exemplo de uma consulta SQL Completa
SELECT DISTINCT nome, idade, salario FROM funcionarios LEFT JOIN departamentos ON funcionarios.dept_id = departamentos.id WHERE idade > 30 AND salario > 3000 GROUP BY departamento HAVING COUNT(*) > 5 ORDER BY salario DESC LIMIT 10 OFFSET 5; |
O que essa consulta faz?
DISTINCT
para evitar duplicatas.LEFT JOIN
com a tabela departamentos
com base no dept_id
.HAVING
).OFFSET 5
).