3 pontos por GN⁺ 2024-11-22 | 1 comentários | Compartilhar no WhatsApp
  • Cookies HTTP: pequenos pedaços de dados usados para manter o estado na web, incluídos em todas as requisições HTTP depois de serem definidos pelo navegador até expirarem.
  • Problema: um determinado código JavaScript causou erro porque a biblioteca padrão do Go não conseguiu fazer o parsing dos cookies.

Especificação

  • RFC 2109, 2965, 6265: definição inicial e atualizações dos cookies. A especificação sobre os valores de cookies não é consistente entre servidor e navegador.
  • Problemas:
    1. O que o servidor deve enviar e o que o navegador deve aceitar não coincide.
    2. Não há restrições para os valores de cookies que o navegador envia ao servidor.
    3. Não há orientação clara sobre como bibliotecas padrão devem tratar cabeçalhos de cookie.

Navegadores web

  • Firefox: permite alguns caracteres não recomendados pela RFC.
  • Chromium: é um pouco mais restritivo que o Firefox, mas ainda permite muitos caracteres.
  • Safari: ao encontrar um caractere não permitido, não interrompe o processamento do cookie e aceita o valor até esse caractere.

Bibliotecas padrão

  • Golang: funciona de forma parecida com a RFC, mas permite espaços e vírgulas.
  • PHP: gera erro em certos caracteres de controle.
  • Python: ignora cookies que não entende e interrompe o carregamento de cookies adicionais.
  • Ruby: aceita todos os caracteres e aplica percent-encoding.
  • Rust: aceita todas as strings UTF-8.

A importância para a web

  • Problema real: por causa da ambiguidade da especificação, muitos sites podem quebrar com facilidade.
  • Solução: o IETF HTTP Working Group precisa atualizar a especificação de cookies e deixar mais claro como navegadores e linguagens de programação devem tratá-los.

Tabela-resumo

  • Tratamento de cookies por navegadores e linguagens: cada navegador e linguagem trata cookies de forma diferente, com níveis variados de aderência à RFC.

1 comentários

 
GN⁺ 2024-11-22
Opiniões no Hacker News
  • Cookies incluem problemas inesperados e comportamentos inconvenientes, mas funcionam em 99,95% dos casos. O sombreamento de cookies é um problema que ocorre quando se definem cookies com o mesmo nome, mas com atributos-chave diferentes, como domínio e caminho, e nem o backend nem o JS conseguem distinguir qual cookie é qual

  • Rust não tem tratamento de cookies na biblioteca padrão e toma como referência o comportamento do crate de terceiros cookie. Isso inclui uma opção de codificação percentual, como no Ruby

  • O protocolo HTTP embute inúmeros outros protocolos, e navegadores e servidores web adicionam várias funcionalidades. Esses recursos não têm uma especificação clara, e cliente e servidor não conseguem definir compatibilidade. Por isso, a situação acaba exigindo que decisões erradas do passado continuem sendo mantidas

  • Cerca de 10 anos atrás, ao implementar sessões baseadas em cookies em um projeto, houve um problema em que funcionava no Safari, mas não no Chrome. Isso acontecia porque os navegadores diferiam no fato de não definir o cookie quando o formato não estava correto

  • O único uso razoável de cookies é definir um token opaco para que o servidor possa reconhecer o cliente. Não é um problema o cliente conseguir lidar com valores que o servidor não enviaria

  • Cookies são um problema complexo, e quase impossível de mudar por causa de questões de compatibilidade retroativa. Há necessidade de criar um novo mecanismo. Por exemplo, um mecanismo NewCookie poderia ter medidas de segurança modernas e uma especificação rigorosa

  • Cookies deveriam desaparecer e poderiam ser substituídos por cabeçalhos de autenticação. Seria bom se houvesse uma forma padrão de autenticar sites no navegador. É uma pena que autenticação Basic e Digest não tenham sido suficientes

  • Como o código de rede do Safari não é open source, o port de Foundation em Swift pode ser uma boa alternativa. Lá é possível verificar caracteres de controle e de exclusão

  • O parsing do cabeçalho Cookie é confuso. O "padrão" não reflete o que realmente existe, e cada servidor backend, biblioteca ou framework aceita coisas diferentes. Se você puder controlar completamente frontend e backend, isso não é um grande problema, mas fica muito complexo quando é preciso interagir com outras coisas

  • Ao experimentar com a linguagem Crystal, houve um problema parecido. A ideia era construir um web scraper simples, mas o cliente HTTP padrão não conseguia fazer o parsing de muitos cookies definidos na resposta e travava