essa é uma rapidinha:
Você pode pensar que deveria ser, mas realmente não é!
Quais são os caracteres permitidos no nome e no valor do cookie?
De acordo com o antigo cookie_spec do Netscape, a NAME=VALUE
string inteira é:
uma sequência de caracteres excluindo ponto-e-vírgula, vírgula e espaço em branco.
Portanto, -
deve funcionar e parece estar bem nos navegadores que tenho aqui; onde você está tendo problemas com isso?
Por implicação do acima exposto:
=
é legal incluir, mas potencialmente ambíguo. Os navegadores sempre dividem o nome e o valor no primeiro =
símbolo da string, portanto, na prática, você pode colocar um =
símbolo no VALUE, mas não no NAME.
O que não foi mencionado, porque o Netscape foi péssimo ao escrever especificações, mas parece ser consistentemente suportado pelos navegadores:
o NAME ou o VALUE podem ser cadeias vazias
se não houver nenhum =
símbolo na string, os navegadores o tratam como o cookie com o nome da string vazia, ou seja, Set-Cookie: foo
é o mesmo que Set-Cookie: =foo
.
quando os navegadores emitem um cookie com um nome vazio, eles omitem o sinal de igual. Então Set-Cookie: =bar
gera Cookie: bar
.
vírgulas e espaços em nomes e valores realmente parecem funcionar, embora os espaços ao redor do sinal de igual sejam aparados
caracteres de controle ( \x00
até \x1F
mais \x7F
) não são permitidos
O que não é mencionado e os navegadores são totalmente inconsistentes são caracteres não ASCII (Unicode):
- no Opera e no Google Chrome, eles são codificados nos cabeçalhos de cookies com UTF-8;
- no IE, a página de código padrão da máquina é usada (específica do local e nunca UTF-8);
- O Firefox (e outros navegadores baseados no Mozilla) usam o byte baixo de cada ponto de código UTF-16 por conta própria (portanto, a ISO-8859-1 é válida, mas qualquer outra coisa é mutilada);
- O Safari simplesmente se recusa a enviar qualquer cookie que contenha caracteres não ASCII.
portanto, na prática, você não pode usar caracteres não ASCII em cookies. Se você deseja usar Unicode, códigos de controle ou outras seqüências de bytes arbitrárias, o cookie_spec exige que você use um esquema de codificação ad-hoc de sua própria escolha e sugira a codificação de URL (conforme produzida pelo JavaScript encodeURIComponent
) como uma opção razoável.
Em termos de padrões reais , houve algumas tentativas de codificar o comportamento dos cookies, mas nenhuma até agora reflete o mundo real.
O RFC 2109 foi uma tentativa de codificar e corrigir o cookie_spec original do Netscape. Nesse padrão, muitos caracteres especiais não são permitidos, pois ele usa tokens RFC 2616 (a ainda-
é permitido lá), e somente o valor pode ser especificado em uma string entre aspas com outros caracteres. Nenhum navegador implementou as limitações, o tratamento especial das seqüências de caracteres citadas e o escape, ou os novos recursos desta especificação.
A RFC 2965 foi outra opção, arrumando 2109 e adicionando mais recursos no esquema de 'cookies da versão 2'. Ninguém nunca implementou nada disso também. Esta especificação tem as mesmas limitações de token e string entre aspas da versão anterior e é uma carga absurda.
O RFC 6265 é uma tentativa da era do HTML5 para esclarecer a bagunça histórica. Ainda não corresponde exatamente à realidade, mas é muito melhor do que as tentativas anteriores - é pelo menos um subconjunto adequado do que os navegadores suportam, não introduzindo nenhuma sintaxe que supostamente funcione, mas não funciona (como a cadeia de caracteres anterior) .
Em 6265, o nome do cookie ainda é especificado como um RFC 2616 token
, o que significa que você pode escolher entre os alfanumos mais:
!#$%&'*+-.^_`|~
No valor do cookie, proíbe formalmente os caracteres de controle (filtrados pelos navegadores) e os caracteres não ASCII (implementados de maneira inconsistente). Ele mantém a proibição do cookie_spec em espaço, vírgula e ponto-e-vírgula, além de compatibilidade com quaisquer idiotas pobres que realmente implementaram as RFCs anteriores, também proibiu barra invertida e aspas, exceto as que envolvem todo o valor (mas, nesse caso, as aspas ainda são consideradas parte de o valor, não um esquema de codificação). Então, isso deixa você com os alfanos mais:
!#$%&'()*+-./:<=>?@[]^_`{|}~
No mundo real, ainda estamos usando o cookie_spec Netscape original e o pior, portanto, o código que consome cookies deve estar preparado para encontrar praticamente qualquer coisa, mas para o código que produz cookies, é aconselhável manter o subconjunto no RFC 6265.
;
caractere contanto que esteja entre aspas duplas? Como tal:Set-Cookie: Name=Va";"lue; Max-Age=3600