Duas notações da mesma família: o cron, a linguagem de agendamento - cinco colunas de números e asteriscos que toda máquina interpreta - e o alfabeto grego, que a engenharia toma emprestado para símbolos e depois discute como pronunciar.

Um assunto, não oito

Um profissional encontra isto como tarefas avulsas. Alguém lhe passa um arquivo de configuração e é . Uma linha de log tem um carimbo de tempo num formato que você nunca viu. Uma API devolve e você precisa dos bytes de volta. Um conflito de mesclagem precisa ser lido. Cada um é consultado quando aparece e esquecido depois, que é por que nunca se acumulam em competência.

São todos a mesma coisa. Cada um é uma convenção para pôr significado numa sequência de caracteres de modo que outra coisa consiga tirar o significado de volta, e as falhas interessantes em todos eles não são erros de interpretação. São as duas pontas discordando sobre o que saiu - que é precisamente a falha que perdeu o Mars Climate Orbiter, em que o mesmo número nu significava duas grandezas físicas diferentes em lados opostos de uma fronteira e os dois programas estavam internamente corretos.

Ordenados assim, os artigos de referência deixam de ser tarefas e viram uma única habilidade.

Estrutura: o que conta como valor

A gramática do JSON é a especificação mais curta que vale saber de cor, e a razão de sabê-la é o que ela não diz. Os casos interessantes estão todos nas lacunas: chaves duplicadas, em que o padrão não diz qual vence e os interpretadores portanto discordam; comentários e vírgulas finais, que não estão na gramática e que metade das ferramentas aceita assim mesmo; e escapes de string, em que a codificação do texto dentro do texto é um problema próprio.

Dois interpretadores aceitarem o mesmo documento e produzirem objetos diferentes é uma propriedade de segurança, não uma curiosidade. É como um filtro e a coisa atrás do filtro passam a discordar.

O YAML compra legibilidade com uma superfície muito maior. Âncoras e apelidos deixam um documento se referir às próprias partes, o que é conveniente e é também expansão - o mesmo formato do billion laughs em XML, em que um documento pequeno vira enorme no caminho de entrada. Escalares de bloco são onde o espaço em branco vira semântico, e onde um certificado colado num manifesto ou sobrevive ou não.

O XML é a família mais antiga e mais explícita: ler a estrutura, espaços de nomes, que existem para que dois vocabulários compartilhem um documento sem colidir, e CDATA, comentários e instruções de processamento - as partes que estão no arquivo e não são o dado.

Formatos de configuração na prática é a comparação entre os três, para o momento em que alguém pergunta qual usar.

Caracteres: o que os bytes eram

Debaixo de todo formato acima há um acordo mais básico. A codificação de caracteres é a questão de quais bytes significam quais caracteres, e as codificações de texto comparadas é a versão prática da mesma questão.

Esta camada é invisível até deixar de ser, e quando falha, falha de um jeito característico: nada dá erro, e o texto simplesmente está errado - um nome num certificado, uma cidade acentuada num log, um nome de host que não casa. A lição do Mars se aplica ao pé da letra, porque lá também os dois lados estavam internamente corretos.

O base64 e o base32 são a habilidade adjacente: não é cifragem, não é compressão, é um jeito de mover bytes arbitrários por um canal que só tolera texto. Reconhecê-los de vista, e saber que reconhecer não é o mesmo que ler, poupa muito tempo numa captura ou num log.

Tempo: o número que significa várias coisas

Carimbos de tempo merecem grupo próprio porque são a falha de intercâmbio mais comum em operações e aquela sobre a qual as pessoas têm mais confiança.

O tempo Unix explicado é a convenção base. O tempo Unix e os segundos bissextos é onde ele deixa de ser uma contagem verdadeira de segundos decorridos, e onde o defeito de núcleo de 2012 derrubou sites grandes por um valor que estava correto em cada sistema individual e errado entre eles. As unidades de época são a questão de segundos contra milissegundos contra nanossegundos, que produz carimbos em 1970 ou no ano 56000. ISO 8601 e RFC 3339 é qual forma escrita, e qual perfil dela. E a aritmética de tempo e fusos horários é a parte que ninguém acerta de primeira.

Se uma linha do tempo de incidente vinda de três sistemas não bate, o defeito quase sempre está neste grupo, e não na memória de alguém sobre os eventos.

Identificadores: para o que a cadeia aponta

URI, URL e URN distingue nomear de localizar, o que soa acadêmico até decidir se uma coisa pode ser buscada. Sua consequência de segurança tem artigo próprio: as URLs enganosas, em que a cadeia que um humano lê e o destino que um interpretador deriva não são o mesmo - a falha de intercâmbio com um adversário anexado.

Mudança: o que está diferente

Ler um diff é o formato que um engenheiro vê mais que qualquer outro e que menos lhe é ensinado. As edições mínimas explicam por que um diff às vezes atribui uma mudança a uma linha que ninguém tocou; o nível de palavra e de caractere é como enxergar através disso; e os diffs de três vias e conflitos de mesclagem são a versão que aparece quando duas pessoas mudaram a mesma coisa.

Um diff é um formato de intercâmbio como os demais: uma afirmação sobre a diferença entre dois estados, codificada para que uma pessoa ou uma ferramenta a reconstrua.

Por que este conjunto é assunto de segurança

Todo artigo acima descreve um lugar em que duas implementações podem discordar sobre o significado dos mesmos bytes, e o problema do interpretador é o que essa discordância vira quando uma das pontas é um atacante: um componente recebe uma cadeia, a interpreta exatamente como documentado, e a interpretação é execução de código.

As perguntas transferíveis são curtas, e são as mesmas para todos eles:

  • O que o remetente quis dizer, e isso está escrito em algum lugar? O Mars Climate Orbiter tinha isso escrito e se perdeu assim mesmo, porque nada comparava o documento com o tráfego.
  • Uma segunda implementação concordaria? Chaves duplicadas, precisão de carimbo, espaço em branco num escalar de bloco, uma URL normalizada - se dois interpretadores podem divergir, um filtro e seu alvo podem divergir.
  • O que expande? Âncoras, entidades, inclusões, escapes. Qualquer coisa que torne um documento maior no caminho de entrada é uma questão de recursos antes de ser uma questão de correção.
  • E o que está no arquivo e não é o dado? Comentários, instruções de processamento, marcas de ordem de byte, espaço em branco no fim. Cada um já foi a totalidade da parada de alguém.