Capítulo 9 — Programação II
Mapa da aula
Aula 09 publicada. Mapa, exemplo, EX025.
flowchart TD
N0["9.1 Um programa de triagem"]
N1["Laboratório — Agrupamento de reportes duplicados e t"]
N2["9.2 Estruturas de dados"]
N3["9.3 Privacidade no processamento"]
N4["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4
N4 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX025"]
Desenho lógico
flowchart LR
N0["9.1 Um programa de triagem"]
N1["Laboratório — Agrupamento de reportes duplicados e t"]
N2["9.2 Estruturas de dados"]
N3["9.3 Privacidade no processamento"]
N4["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> Q["EX025"]
[9.1 Um programa de triagem]
|
v
[Laboratório — Agrupamento de reportes duplicados e t]
|
v
[9.2 Estruturas de dados]
|
v
[9.3 Privacidade no processamento]
|
v
[Síntese]
|
v
[Exemplo resolvido] --> [Exercício EX025]
Objetivos de aprendizagem
Você vai (1) estruturar um programa que processa e-mails reportados; (2) desenhar estruturas de dados para a triagem; (3) proteger a privacidade no processamento automatizado.
9.1 Um programa de triagem
A equipe de segurança da Greyford recebe muitos e-mails reportados. Aiko escreve um programa que agrupa os reportes do mesmo e-mail, conta quantos funcionários reportaram cada um e registra o horário do primeiro reporte. Agrupar reduz a carga da equipe, porque vinte reportes de um mesmo e-mail de phishing exigem uma só investigação. Ela estrutura o programa em funções pequenas para leitura, agrupamento e resumo, cada uma testada separadamente, para que mudanças futuras sejam mais seguras. Escreve um teste curto para cada função usando pequenas listas de reportes feitas à mão, de modo que qualquer mudança posterior que quebre o agrupamento ou a contagem de tempo seja notada imediatamente, e não descoberta durante um incidente real.
Laboratório — Agrupamento de reportes duplicados e tempo até o primeiro reporte
# Group duplicate reported emails and find first-report delay (synthetic; minutes after arrival).
reports = [("payroll@greyf0rd.co", "Update your bank details", m) for m in (9, 11, 12, 14, 15, 18, 20, 22, 25, 30, 33, 40, 41, 45)] + \
[("it-help@vendorx.io", "Mailbox full", m) for m in (25, 31, 38, 47, 52, 60, 66, 70, 75)] + \
[("news@supplier.example", "Monthly newsletter", m) for m in (120, 180, 200)] + \
[("dhl-track@parcel.example", "Missed delivery", m) for m in (16, 19, 27, 29, 35, 44, 48)] + \
[("ceo.greyford@gmail.example", "Quick favour", m) for m in (14, 17, 26, 39, 55)] + \
[("hr@greyford.example", "Benefits survey", m) for m in (90, 95)]
groups = {}
for sender, subject, m in reports:
key = (sender, subject.lower()); c, first = groups.get(key, (0, 10**9)); groups[key] = (c + 1, min(first, m))
print(f"{len(reports)} reports -> {len(groups)} distinct emails")
for (s, subj), (c, first) in sorted(groups.items(), key=lambda x: -x[1][0]):
print(f"{c:3d} reports, first after {first:3d} min: {subj} <{s}>")
Execute com python3 lab_triage.py. Saída verificada:
40 reports -> 6 distinct emails
14 reports, first after 9 min: update your bank details <payroll@greyf0rd.co>
9 reports, first after 25 min: mailbox full <it-help@vendorx.io>
7 reports, first after 16 min: missed delivery <dhl-track@parcel.example>
5 reports, first after 14 min: quick favour <ceo.greyford@gmail.example>
3 reports, first after 120 min: monthly newsletter <news@supplier.example>
2 reports, first after 90 min: benefits survey <hr@greyford.example>
9.2 Estruturas de dados
Aiko usa um dicionário indexado por uma impressão digital do remetente e do assunto de cada e-mail. Cada entrada guarda a contagem e o horário do primeiro reporte. Essa estrutura torna o agrupamento rápido mesmo com milhares de reportes. O laboratório mostra que quarenta reportes se reduzem a seis e-mails distintos e que o e-mail mais reportado teve seu primeiro reporte nove minutos após a chegada. Esse tempo até o primeiro reporte é o número-chave da exposição, que remete ao modelo de cálculo do capítulo 1. Ela observa que um remetente digitado de forma ligeiramente diferente poderia dividir uma campanha em dois grupos, e acrescenta uma opção de fusão manual.
9.3 Privacidade no processamento
E-mails reportados podem conter informações pessoais. O programa de Aiko guarda apenas o remetente, a impressão digital do assunto e os horários dos reportes, e não o corpo das mensagens nem os nomes de quem reportou. A equipe de segurança pode abrir o e-mail original em uma ferramenta controlada quando necessário. Ela documenta o que o programa guarda e por quê. Minimizar os dados guardados em ferramentas automatizadas reduz o risco caso o banco de dados da ferramenta seja exposto, e tranquiliza os funcionários de que reportar não expõe a própria caixa de e-mail. Ela compartilha a lista de campos guardados com os representantes dos funcionários, que a recebem bem e concordam em mencioná-la ao divulgar o botão de reporte.
Exemplo resolvido
Aiko escreve um programa de triagem testado que agrupa reportes duplicados com um dicionário, encontra o tempo até o primeiro reporte e guarda dados mínimos.
Caso sintético. Os reportes são sintéticos.
Erros e limites
Impressões digitais podem separar variantes de uma mesma campanha. O armazenamento mínimo pode limitar investigações posteriores.
Exercícios
- EX025 — Benefício do agrupamento. Por que agrupar reportes duplicados? Rubrica: 3 = muitos reportes de um e-mail exigem uma só investigação;; 2 = carga de trabalho;; 1 = vago;; 0 = nenhuma.
- EX026 — Agrupamento no laboratório. A quantos e-mails distintos os quarenta reportes se reduziram no laboratório? Rubrica: 3 = seis, o principal com primeiro reporte após 9 minutos;; 2 = seis;; 1 = quarenta;; 0 = nenhuma.
- EX027 — Campos guardados. O que o programa de triagem guarda? Rubrica: 3 = apenas remetente, impressão digital do assunto e horários dos reportes;; 2 = mínimo;; 1 = corpos;; 0 = nenhuma.
Síntese
Um código de triagem bem estruturado reduz a carga de trabalho e mede a exposição, armazenando apenas o que precisa.
Continue estudando — aula 09 (capítulo 09 de 50)
← Capítulo 08 · Índice das aulas · Capítulo 10 →
Continue para a próxima aula já escrita.