Mapa da aula
Aula 13 publicada. Mapa, exemplo, EX037.
flowchart TD
N0["13.1 Classificar dados"]
N1["13.2 Consultas parametrizadas"]
N2["Laboratório — Consulta concatenada versus parametriz"]
N3["13.3 Retenção e minimização"]
N4["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4
N4 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX037"]
Desenho lógico
flowchart LR
N0["13.1 Classificar dados"]
N1["13.2 Consultas parametrizadas"]
N2["Laboratório — Consulta concatenada versus parametriz"]
N3["13.3 Retenção e minimização"]
N4["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> Q["EX037"]
[13.1 Classificar dados]
|
v
[13.2 Consultas parametrizadas]
|
v
[Laboratório — Consulta concatenada versus parametriz]
|
v
[13.3 Retenção e minimização]
|
v
[Síntese]
|
v
[Exemplo resolvido] --> [Exercício EX037]
Objetivos de aprendizagem
Você vai (1) classificar os dados de uma organização de transporte; (2) prevenir injeção com consultas parametrizadas; (3) projetar a retenção e a minimização de dados.
13.1 Classificar dados
A Corvia guarda vários tipos de dados: identificadores de cartões e históricos de viagem, tokens de pagamento, registros de funcionários, dados de horários e telemetria dos veículos. Sofia ajuda a classificá-los. Os históricos de viagem são dados pessoais que revelam onde as pessoas moram e trabalham; os tokens de pagamento são dados financeiros sensíveis; os horários são públicos. A classificação orienta a arquitetura: dados pessoais e de pagamento precisam de criptografia, controles de acesso e logging, enquanto dados públicos precisam de integridade, mas não de confidencialidade. Daniel ressalta que a classificação precisa ser feita antes do projeto, porque adaptar a proteção a um banco cheio de dados misturados é caro e muitas vezes incompleto.
13.2 Consultas parametrizadas
Sofia escreve uma consulta para buscar viagens pelo identificador do cartão. Sua primeira versão monta a string SQL concatenando a entrada do usuário. Daniel lhe mostra que uma entrada como uma aspa seguida de OR 1=1 muda o sentido da consulta e devolve todas as viagens, um ataque de injeção. A correção é uma consulta parametrizada, em que o driver do banco passa a entrada como dado, nunca como código. O laboratório abaixo demonstra as duas com o módulo sqlite3 embutido no Python, sobre uma tabela sintética. A consulta concatenada vaza todas as linhas; a parametrizada não devolve nenhuma para a entrada maliciosa.
Laboratório — Consulta concatenada versus parametrizada
# Injection vs parameterised query with stdlib sqlite3 on a synthetic table.
import sqlite3
db = sqlite3.connect(":memory:")
db.execute("CREATE TABLE journeys (card TEXT, stop TEXT)")
db.executemany("INSERT INTO journeys VALUES (?, ?)", [("C100", "Harbour"), ("C100", "Market"), ("C200", "Depot"), ("C300", "Airport")])
evil = "X' OR '1'='1"
rows_bad = db.execute(f"SELECT * FROM journeys WHERE card = '{evil}'").fetchall() # never do this
rows_ok = db.execute("SELECT * FROM journeys WHERE card = ?", (evil,)).fetchall()
print("concatenated query rows:", len(rows_bad))
print("parameterised query rows:", len(rows_ok))
print("legit lookup C100:", len(db.execute("SELECT * FROM journeys WHERE card = ?", ("C100",)).fetchall()))
Execute com python3 lab_sqli.py. Saída verificada:
concatenated query rows: 4
parameterised query rows: 0
legit lookup C100: 2
13.3 Retenção e minimização
Guardar dados para sempre aumenta o dano de qualquer vazamento. Sofia propõe um desenho de retenção: históricos de viagem detalhados mantidos por noventa dias para atendimento ao cliente e investigação de fraudes, e depois agregados em contagens anônimas para o planejamento. Os tokens de pagamento são mantidos só pelo tempo que o provedor de pagamentos exige. A ISO/IEC 27002:2022 inclui controles sobre exclusão de informações e mascaramento de dados. Ela documenta cada prazo de retenção com sua finalidade. A minimização é um controle de arquitetura: dados que não são armazenados não podem ser roubados, e um conjunto de dados menor é mais fácil de proteger bem.
Exemplo resolvido
Sofia classifica cinco tipos de dados da Corvia, demonstra a injeção e sua correção no sqlite3 e propõe um desenho de retenção de noventa dias para os históricos de viagem.
Caso sintético. Os dados, as tabelas e os prazos de retenção são sintéticos; a ISO/IEC 27002:2022 é real.
Erros e limites
A agregação ainda pode permitir a reidentificação em grupos pequenos. As regras de retenção dependem da lei e precisam ser conferidas com o jurídico.
Exercícios
-
EX037 — Sensibilidade das viagens. Por que os históricos de viagem são dados pessoais que precisam de proteção?
Mostrar critérios de avaliação
Rubrica: 3 = revelam onde as pessoas moram, trabalham e circulam;; 2 = localização;; 1 = públicos;; 0 = nenhuma. -
EX038 — Resultado da injeção no laboratório. O que o laboratório devolveu para a entrada maliciosa em cada estilo de consulta?
Mostrar critérios de avaliação
Rubrica: 3 = a concatenada devolveu as 4 linhas; a parametrizada devolveu 0;; 2 = as duas;; 1 = iguais;; 0 = nenhuma. -
EX039 — Lógica da minimização. Por que a minimização de dados é um controle de segurança?
Mostrar critérios de avaliação
Rubrica: 3 = dados não armazenados não podem ser roubados, e conjuntos menores são mais fáceis de proteger;; 2 = não roubados;; 1 = não é um controle;; 0 = nenhuma.
Síntese
A arquitetura de dados classifica antes de projetar, mantém a entrada como dado e armazena apenas o necessário pelo tempo necessário.