Capítulo 8 — Programação II
Mapa da aula
Aula 08 publicada. Mapa, exemplo, EX022.
flowchart TD
N0["8.1 Feeds como arquivos"]
N1["Laboratório — validar um feed"]
N2["8.2 Lendo o resultado"]
N3["8.3 Regras de validação"]
N4["8.4 Nunca descarte em silêncio"]
N5["8.5 Idempotência"]
N6["8.6 Codificação e delimitadores"]
N7["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> N7
N7 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX022"]
Desenho lógico
flowchart LR
N0["8.1 Feeds como arquivos"]
N1["Laboratório — validar um feed"]
N2["8.2 Lendo o resultado"]
N3["8.3 Regras de validação"]
N4["8.4 Nunca descarte em silêncio"]
N5["8.5 Idempotência"]
N6["8.6 Codificação e delimitadores"]
N7["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> N7 --> Q["EX022"]
[8.1 Feeds como arquivos]
|
v
[Laboratório — validar um feed]
|
v
[8.2 Lendo o resultado]
|
v
[8.3 Regras de validação]
|
v
[8.4 Nunca descarte em silêncio]
|
v
[8.5 Idempotência]
|
v
[8.6 Codificação e delimitadores]
|
v
[Síntese]
|
v
[Exemplo resolvido] --> [Exercício EX022]
Objetivos de aprendizagem
Você vai (1) fazer o parsing de um feed de indicadores em CSV com a biblioteca padrão; (2) validar cada linha e registrar os motivos de rejeição; (3) relatar contagens com honestidade; (4) projetar scripts que possam ser auditados.
8.1 Feeds como arquivos
O HSSC distribui um CSV diário com colunas para tipo, valor, data da primeira observação e TLP. Planilhas estragam esses arquivos — transformam números longos em notação científica ou removem zeros à esquerda —, por isso Amara os processa com o módulo csv do Python. Ela mantém o arquivo original inalterado e grava a saída processada em um arquivo novo, para que qualquer dúvida sobre o feed possa ser conferida com o que o HSSC realmente enviou. Ela evita abrir o original em uma planilha mesmo para uma olhada rápida, porque salvá-lo por acidente poderia mudar valores sem que ninguém percebesse.
Laboratório — validar um feed
"""Lab 1 (ch 08): parse a synthetic CSV feed with the csv module and count accepted/rejected rows."""
import csv, io
data = """type,value,first_seen,tlp
domain,portal-login.example,2026-09-01,TLP:GREEN
ipv4,203.0.113.50,2026-09-02,TLP:AMBER
domain,,2026-09-02,TLP:GREEN
sha256,abc123,2026-09-03,TLP:GREEN
url,http://files.example/x,2026-09-04,TLP:CLEAR
"""
ok, bad = [], []
for row in csv.DictReader(io.StringIO(data)):
if not row["value"]:
bad.append(("empty value", row)); continue
if row["type"] == "sha256" and len(row["value"]) != 64:
bad.append(("sha256 length", row)); continue
ok.append(row)
print("accepted", len(ok), "rejected", len(bad))
for reason, row in bad:
print(" reject:", reason, row["type"], row["first_seen"])
Execute com python3 lab_csvfeed.py. Saída verificada:
accepted 3 rejected 2
reject: empty value domain 2026-09-02
reject: sha256 length sha256 2026-09-03
8.2 Lendo o resultado
Três linhas passam; duas falham. Uma tem o valor de domínio vazio; outra diz ser um hash SHA-256, mas tem o tamanho errado. Cada rejeição é impressa com sua data e seu motivo, para que Amara possa enviar ao HSSC um feedback preciso, em vez de "seu feed está quebrado". O feedback vai para o contato do HSSC com os números das linhas, para que os erros sejam corrigidos na origem para todos os membros. Ela também confere se as mesmas falhas apareceram em arquivos anteriores. Nenhuma tinha aparecido.
8.3 Regras de validação
As regras verificam presença (nenhum valor vazio), forma (tamanho do hash, endereço válido), vocabulário permitido (rótulos TLP do FIRST TLP 2.0: CLEAR, GREEN, AMBER, AMBER+STRICT, RED) e formato de data. As regras devem ser poucas, explícitas e testadas. Amara escreve um teste para cada regra usando um pequeno arquivo de linhas boas e ruins, então mudar uma regra mostra na hora que casos ela afeta. Ela mantém a lista de regras na documentação do script e a compartilha com o HSSC, para que a comunidade saiba o que o HCHT confere e possa pegar problemas antes de enviar o feed. Novas regras só são acrescentadas depois que um problema real mostra que são necessárias.
8.4 Nunca descarte em silêncio
Um script que pula linhas ruins sem avisar torna as contagens indignas de confiança. Sempre relate os totais aceitos e rejeitados. A importação de Amara imprime os dois totais e grava as linhas rejeitadas em um arquivo, com o motivo de cada uma. Se os totais não somam o número de linhas do feed, o script para com um erro. Um descarte silencioso já escondeu por uma semana uma mudança de coluna em um feed, até que um domínio ausente foi notado por acaso, e é por isso que a regra agora é rígida.
8.5 Idempotência
Rodar a importação duas vezes não deve criar duplicatas. Use o valor mais o tipo como chave e atualize os metadados em vez de acrescentar linhas novas. Amara testa isso importando o mesmo feed duas vezes e conferindo que a contagem de linhas não muda, enquanto a data da última observação é atualizada. A idempotência importa porque as importações são executadas de novo depois de falhas, e as duplicatas inflariam as contagens nos relatórios e fariam um indicador parecer vir de duas fontes, aumentando uma confiança que a evidência não sustenta.
8.6 Codificação e delimitadores
Os feeds chegam com codificações e separadores diferentes. Abra os arquivos com uma codificação explícita, detecte ou declare o delimitador e remova caracteres invisíveis, como marcas de ordem de bytes, do primeiro cabeçalho. Muitos erros intrigantes de "coluna ausente" são só um caractere escondido no nome do primeiro campo. Amara acrescenta as duas etapas à sua função de importação. A importação imprime a codificação e o delimitador detectados, para que uma mudança na forma como o HSSC produz o arquivo seja notada na hora, em vez de aparecer mais tarde como um erro intrigante. Amara mantém um pequeno conjunto de arquivos de exemplo com codificações diferentes como testes.
Exemplo resolvido
No dia seguinte, o feed traz uma linha com TLP "AMBER STRICT" (espaço em vez de sinal de mais). O script de Amara a rejeita com o motivo unknown TLP label. Ela pede ao HSSC que a corrija em vez de adivinhar, porque tratá-la como AMBER afrouxaria uma restrição.
Caso sintético. As linhas do feed são inventadas.
Erros e limites
Formato válido não é verdade. Um indicador bem formado pode estar errado ou desatualizado; a validação é só a primeira barreira.
Exercícios
- EX022 — Rejeições do laboratório. Que duas linhas falharam no laboratório, e por quê? Rubrica: 3 = domínio vazio (09-02); tamanho de sha256 errado (09-03); 2 = uma; 1 = só as contagens; 0 = nenhuma.
- EX023 — Erro de digitação no TLP. Por que "AMBER STRICT" não deve ser mapeado automaticamente para AMBER? Rubrica: 3 = afrouxaria a restrição; perguntar ao remetente; 2 = parcial; 1 = inofensivo; 0 = nenhuma.
- EX024 — Segurança na reexecução. Como o importador deve evitar duplicatas quando roda duas vezes? Rubrica: 3 = chave por tipo+valor; atualizar em vez de inserir; 2 = remover duplicatas de forma vaga; 1 = apagar tudo antes; 0 = nenhuma.
Síntese
Faça o parsing com código, valide de forma explícita, relate as rejeições e mantenha as importações idempotentes.
Continue estudando — capítulo 08 de 40
← Capítulo 07 (rascunho) · Índice de capítulos do curso · Capítulo 09 (rascunho) →