celui-ci est un quickie:
Vous pourriez penser que cela devrait l'être, mais ce n'est vraiment pas du tout!
Quels sont les caractères autorisés dans le nom et la valeur du cookie?
Selon l'ancien cookie_spec de Netscape, la NAME=VALUE
chaîne entière est:
une séquence de caractères excluant les points-virgules, les virgules et les espaces blancs.
-
Cela devrait donc fonctionner, et cela semble être OK dans les navigateurs que j'ai ici; où avez-vous des problèmes avec ça?
Par implication de ce qui précède:
=
est légal à inclure, mais potentiellement ambigu. Les navigateurs divisent toujours le nom et la valeur sur le premier =
symbole de la chaîne, donc en pratique vous pouvez mettre un =
symbole dans la VALEUR mais pas le NOM.
Ce qui n'est pas mentionné, car Netscape était horrible lors de l'écriture de spécifications, mais semble toujours pris en charge par les navigateurs:
le NOM ou la VALEUR peuvent être des chaînes vides
s'il n'y a aucun =
symbole dans la chaîne, les navigateurs le traitent comme le cookie avec le nom de chaîne vide, c'est Set-Cookie: foo
-à- dire le même que Set-Cookie: =foo
.
lorsque les navigateurs génèrent un cookie avec un nom vide, ils omettent le signe égal. Alors Set-Cookie: =bar
engendre Cookie: bar
.
les virgules et les espaces dans les noms et les valeurs semblent réellement fonctionner, bien que les espaces autour du signe égal soient coupés
les caractères de contrôle ( \x00
en \x1F
plus \x7F
) ne sont pas autorisés
Ce qui n'est pas mentionné et les navigateurs sont totalement incohérents, ce sont les caractères non ASCII (Unicode):
- dans Opera et Google Chrome, ils sont encodés en en-têtes de cookie avec UTF-8;
- dans IE, la page de codes par défaut de la machine est utilisée (spécifique aux paramètres régionaux et jamais UTF-8);
- Firefox (et d'autres navigateurs basés sur Mozilla) utilisent seul l'octet de poids faible de chaque point de code UTF-16 (donc ISO-8859-1 est OK mais tout le reste est mutilé);
- Safari refuse simplement d'envoyer tout cookie contenant des caractères non ASCII.
dans la pratique, vous ne pouvez donc pas utiliser du tout de caractères non ASCII dans les cookies. Si vous souhaitez utiliser Unicode, des codes de contrôle ou d'autres séquences d'octets arbitraires, le cookie_spec vous demande d'utiliser un schéma de codage ad hoc de votre choix et de suggérer un codage URL (tel que produit par JavaScript encodeURIComponent
) comme un choix raisonnable.
En termes de normes réelles , il y a eu quelques tentatives de codification du comportement des cookies, mais aucune ne reflète jusqu'à présent le monde réel.
La RFC 2109 était une tentative de codification et de correction du cookie_spec Netscape d'origine. Dans cette norme, de nombreux autres caractères spéciaux sont interdits, car il utilise des jetons RFC 2616 (a y -
est toujours autorisé), et seule la valeur peut être spécifiée dans une chaîne entre guillemets avec d'autres caractères. Aucun navigateur n'a jamais implémenté les limitations, la gestion spéciale des chaînes entre guillemets et des échappements, ou les nouvelles fonctionnalités de cette spécification.
Le RFC 2965 a été une autre tentative, rangeant 2109 et ajoutant plus de fonctionnalités dans le cadre d'un schéma de «cookies de version 2». Personne n'a jamais mis en œuvre cela non plus. Cette spécification a les mêmes limitations de chaîne de jetons et de chaînes que la version précédente et c'est tout autant une charge de non-sens.
La RFC 6265 est une tentative de l'ère HTML5 pour éliminer le gâchis historique. Cela ne correspond toujours pas exactement à la réalité, mais c'est beaucoup mieux que les tentatives précédentes - c'est au moins un sous-ensemble approprié de ce que les navigateurs prennent en charge, n'introduisant aucune syntaxe censée fonctionner mais qui ne fonctionne pas (comme la chaîne citée précédente) .
Dans 6265, le nom du cookie est toujours spécifié comme RFC 2616 token
, ce qui signifie que vous pouvez choisir parmi les alphanums plus:
!#$%&'*+-.^_`|~
Dans la valeur du cookie, il interdit formellement les caractères de contrôle (filtrés par les navigateurs) et les caractères non ASCII (mis en œuvre de manière incohérente). Il conserve l'interdiction de cookie_spec sur l'espace, la virgule et le point-virgule, ainsi que pour la compatibilité avec tous les idiots pauvres qui ont effectivement mis en œuvre les RFC antérieurs, il a également interdit la barre oblique inverse et les guillemets, autres que les guillemets enveloppant la valeur entière (mais dans ce cas, les guillemets sont toujours considérés comme faisant partie de la valeur, pas un schéma de codage). Cela vous laisse donc avec les alphanums plus:
!#$%&'()*+-./:<=>?@[]^_`{|}~
Dans le monde réel, nous utilisons toujours l'original et le pire Netscape cookie_spec, donc le code qui consomme des cookies doit être prêt à rencontrer à peu près n'importe quoi, mais pour le code qui produit des cookies, il est conseillé de s'en tenir au sous-ensemble dans la RFC 6265.
;
caractère tant qu'il est entouré de guillemets doubles? En tant que tel:Set-Cookie: Name=Va";"lue; Max-Age=3600