Capítulo 9 — Dados e bancos de dados
Mapa da aula
Aula 09 publicada. Mapa, exemplo, EX025.
flowchart TD
N0["9.1 Bancos de dados de aplicativos"]
N1["9.2 Noções de SQL"]
N2["Laboratório — consultando o histórico do navegador"]
N3["9.3 Lendo o resultado"]
N4["9.4 Esquemas reais de navegadores"]
N5["9.5 Cautela"]
N6["9.6 Corroboração"]
N7["9.7 Documentação"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> N7
N7 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX025"]
Desenho lógico
flowchart LR
N0["9.1 Bancos de dados de aplicativos"]
N1["9.2 Noções de SQL"]
N2["Laboratório — consultando o histórico do navegador"]
N3["9.3 Lendo o resultado"]
N4["9.4 Esquemas reais de navegadores"]
N5["9.5 Cautela"]
N6["9.6 Corroboração"]
N7["9.7 Documentação"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> N7 --> Q["EX025"]
[9.1 Bancos de dados de aplicativos]
|
v
[9.2 Noções de SQL]
|
v
[Laboratório — consultando o histórico do navegador]
|
v
[9.3 Lendo o resultado]
|
v
[9.4 Esquemas reais de navegadores]
|
v
[9.5 Cautela]
|
v
[9.6 Corroboração]
|
v
[9.7 Documentação]
|
v
[Exemplo resolvido] --> [Exercício EX025]
Objetivos de aprendizagem
Você vai (1) consultar com SQL o banco de dados de um aplicativo; (2) entender a estrutura do histórico do navegador; (3) filtrar por janelas de tempo; (4) interpretar com cautela os resultados das consultas.
9.1 Bancos de dados de aplicativos
Navegadores, aplicativos de conversa e celulares guardam registros em bancos de dados SQLite. Cada tabela tem colunas como URL, título e horário da visita. Os peritos trabalham com cópias, nunca com o arquivo original, porque abrir um banco de dados pode alterá-lo (por exemplo, aplicando um registro de escrita antecipada, o write-ahead log). Um registro de escrita antecipada guarda alterações recentes ainda não incorporadas ao arquivo principal do banco. Abrir o banco com uma ferramenta comum pode incorporá-las e alterar o arquivo, e então o hash da cópia deixaria de coincidir. Os peritos copiam o banco junto com seus arquivos acompanhantes e trabalham apenas sobre as cópias, guardando o hash de cada uma.
9.2 Noções de SQL
SELECT escolhe colunas, WHERE filtra linhas, ORDER BY ordena. As consultas são guardadas com o caso, para que outros possam executá-las de novo. A consulta do laboratório combina as três: seleciona horário e URL, filtra o intervalo de 09:10 a 09:20 UTC e ordena pelo horário. Guardar o texto exato da consulta permite que um revisor veja a janela usada e a execute de novo; mudar a janela para 09:00–09:30 devolveria também a entrada do quadro de horários às 09:02, que não tem relação com o evento de phishing. Uma janela mais larga não está errada, mas o laudo deve dizer qual foi usada e por quê.
Laboratório — consultando o histórico do navegador
"""Query a synthetic browser-history database (sqlite3, in memory)."""
import sqlite3
db = sqlite3.connect(":memory:")
db.execute("create table visits(url text, title text, ts text)")
db.executemany("insert into visits values(?,?,?)", [
("https://intranet.example/timetable", "Timetable", "2026-02-10T09:02:00Z"),
("https://login-portal.example.net/verify", "Verify your account", "2026-02-10T09:14:30Z"),
("https://mail.example/inbox", "Inbox", "2026-02-10T09:13:55Z"),
("https://intranet.example/library", "Library", "2026-02-10T10:40:00Z")])
for row in db.execute("select ts, url from visits where ts between '2026-02-10T09:10' and '2026-02-10T09:20' order by ts"):
print(*row)
print("total visits:", db.execute("select count(*) from visits").fetchone()[0])
Execute com python3 lab_history.py. Saída verificada:
2026-02-10T09:13:55Z https://mail.example/inbox
2026-02-10T09:14:30Z https://login-portal.example.net/verify
total visits: 4
9.3 Lendo o resultado
O histórico sintético tem quatro visitas. Filtrar o intervalo de 09:10 a 09:20 UTC devolve duas: a caixa de entrada do webmail às 09:13:55 e a página falsa "Verify your account" às 09:14:30. A sequência — caixa de entrada e, 35 segundos depois, uma página de verificação — é coerente com o acesso a um link a partir de um e-mail. Observe a ordenação: as linhas foram inseridas fora de ordem, mas ORDER BY as devolve por horário. Sem ele, o banco pode devolver as linhas na ordem de armazenamento, e um leitor poderia confundir essa ordem com a sequência dos eventos. Aqui a comparação funciona sobre texto porque o formato ISO se ordena corretamente como texto quando todas as entradas usam o mesmo fuso horário e a mesma precisão, o que os dados sintéticos garantem.
9.4 Esquemas reais de navegadores
Os navegadores reais guardam os horários em formatos próprios (por exemplo, microssegundos desde uma época de referência) e dividem os dados entre várias tabelas. Ferramentas validadas os decodificam; a tabela sintética de Leah usa texto ISO para fins didáticos. Decodificar esses horários à mão é propenso a erros: confundir microssegundos com milissegundos, ou escolher a data inicial errada, desloca um horário em anos ou décadas. As ferramentas validadas foram testadas com valores conhecidos, e é por isso que os peritos confiam nelas no trabalho real. Leah confere um horário decodificado com uma fonte independente, como o registro do proxy, antes de confiar nos demais.
9.5 Cautela
O histórico pode ter sido apagado ou estar incompleto (navegação privada, sincronização). A ausência de uma visita não prova que ela não aconteceu. Na ws-114, uma entrada ausente pode significar que o usuário navegou em modo privado, apagou o histórico ou usou outro navegador. A sincronização também pode trazer visitas feitas em outros dispositivos, então uma entrada pode nem ter acontecido na ws-114. Leah informa qual navegador e qual perfil examinou e trata o registro do proxy como a verificação independente do que saiu da máquina.
9.6 Corroboração
A entrada das 09:14:30 coincide com o horário do POST no proxy, uma fonte independente. O proxy é um sistema separado, com relógio e armazenamento próprios, então sua concordância tem significado. Se os dois horários diferissem por um valor fixo, as defasagens de relógio registradas antes o explicariam; se diferissem de modo irregular, Leah questionaria se ambos descrevem a mesma visita. Aqui o horário do navegador, depois de corrigida a defasagem de 47 segundos do relógio da ws-114 medida na apreensão, coincide exatamente com o do proxy, e ela o relata nomeando as duas fontes. Cada fonte sozinha seria mais fraca; juntas, mostram que a página foi visitada e que dados foram enviados a ela.
9.7 Documentação
Registre o caminho do banco, o hash da cópia, o texto da consulta e a contagem de resultados. Esses quatro itens permitem que um revisor repita o trabalho com exatidão: encontrar o mesmo banco, confirmar pelo hash que a cópia não mudou, executar a mesma consulta e esperar a mesma contagem. A anotação do exemplo resolvido faz isso numa única frase. Sem o texto da consulta, "duas linhas" não pode ser conferido, porque outra janela poderia devolver outro número. Leah mantém esses itens numa ordem fixa nas anotações, para que a falta de algum salte aos olhos.
Junções
Algumas perguntas exigem duas tabelas: visitas e URLs costumam ser guardadas separadamente e ligadas por um identificador. Um JOIN as combina. Leah confere cada junção contando as linhas antes e depois, para perceber duplicações ou perdas.
Exemplo resolvido
Leah registra: "A cópia do banco de dados History (SHA-256 registrado) foi consultada para o intervalo de 09:10 a 09:20 UTC; 2 linhas devolvidas; a visita à página falsa de verificação às 09:14:30 coincide com o POST no registro do proxy no mesmo segundo."
Caso sintético. O banco de dados é criado pelo script do laboratório.
Erros e limites
A comparação de horários ISO como texto só funciona quando todos os horários têm o mesmo formato e o mesmo fuso; normalize primeiro.
Exercícios
- EX025 — Resultado da janela. Quais visitas caem na janela de 09:10 a 09:20? Rubrica: 3 = caixa de entrada às 09:13:55, página falsa às 09:14:30; 2 = uma; 1 = errado; 0 = nada.
- EX026 — Trabalhar na cópia. Por que consultar uma cópia do banco de dados? Rubrica: 3 = abri-lo pode alterá-lo (WAL); 2 = parcial; 1 = rapidez; 0 = nada.
- EX027 — Visita ausente. O que a ausência de uma visita no histórico mostra? Rubrica: 3 = não mostra que ela não aconteceu; apagamento/modo privado; 2 = parcial; 1 = prova que não houve visita; 0 = nada.
Síntese
SQL sobre bancos copiados, consultas guardadas e corroboração fazem dos dados de aplicativos uma evidência confiável.
Continue estudando — capítulo 09 de 40
← Capítulo 08 (rascunho) · Índice de capítulos do curso · Capítulo 10 (rascunho) →