2009-08-21 17 views
3

Selon la norme RFC 2109, la valeur d'un cookie "est opaque pour l'agent utilisateur et peut être tout ce que le serveur d'origine choisit d'envoyer, éventuellement dans un codage ASCII imprimable sélectionné par le serveur." En conséquence, différents langages/plates-formes/serveurs envoient une valeur de cookie différente même si la valeur d'origine est la même.Gestion des valeurs de cookie encodées en C#

Par exemple, C#/ASP.NET envoie le texte tel quel; ASP urlencodes classiques et urldecodes le texte; Perl/Apache urlencodes/décode le texte (mais différemment de ASP!). Php vous donne l'option.

Je suis en train d'écrire un système de Single Sign-On qui a besoin de partager un cookie avec des applications très différentes. En particulier, j'ai .NET, Java, Perl, ColdFusion qui doivent être pris en charge dès le départ.

Le texte que je stocke dans le cookie est toujours une chaîne ASCII-7 valide. Néanmoins, Perl aime coder des caractères ASCII 7 bits, par exemple.

Je vois deux principales alternatives pour faire ce travail:

  1. acceptent Seules les valeurs non codées. Après tout, il n'y a pas besoin de les encoder. C'est comme ça en ce moment. Évidemment, tous les systèmes intégrés doivent pouvoir supporter des valeurs non codées.

  2. Accepte les valeurs codées et non codées. Cela permettrait une compatibilité maximale hors de la boîte, mais je devrais déterminer si une valeur particulière est codée ou non (ce qui semble tout à fait impossible: est "% 20" la chaîne littérale "% 20" ou un espace?)

Quelle solution suggéreriez-vous et pourquoi? Si c'est # 2, comment détecteriez-vous le texte UrlEncoded?


Exemple d'un cookie (je l'ai ajouté la ligne casse pour l'adapter)

A5A2794D694241AD92F9B22F288EFAA1|8428DCCC|20090821142732|20090821142832| 
10.100.107.40|955098D50AB4982D4E247EFA53F4E23B32A05ED0131E096709BE1D8CCC 
8A3CA18252D376473C244FD71C462AB42CF54C 

Répondre

1

Quelle est la raison pour laquelle vous ne pouvez pas avoir une valeur purement alphanumérique? Si vous avez des données binaires opaques que vous essayez de persister, vous pouvez utiliser hexadécimal ou utiliser "web safe" base64.

Le moins probable que vous faites en sorte que n'importe qui va déranger avec votre cookie du tout, le meilleur IMO.

+0

J'utilise déjà HEX. Le seul caractère non alphanumérique est un caractère de pipe pour séparer les champs - c'est ce qui est codé par Perl. D'un autre côté, n'importe quel personnage pourrait être encodé pour tout ce que je connais sous d'autres plateformes. Vous ne savez jamais :) – Sklivvz

+1

Je pense que si vous vous en tenez à alphanumérique, ça ira. Utilisez simplement X comme délimiteur au lieu de | –

3

Oui, ce n'est pas un problème trivial. Fondamentalement, je penche plus pour la solution # 2 puisque c'est la plus interopérable. Cependant, comme vous le dites, il est tout à fait un problème non-trivial de détecter quels cookies sont codés en URL et lesquels ne le sont pas. Une chose qui me vient à l'esprit est que vous pouvez utiliser des caractères spéciaux pour remplir le début de vos valeurs de cookies et ainsi vous pouvez détecter si le cookie est encodé ou non. Bien sûr, cela peut ne pas couvrir tous les clients, mais par exemple si vos valeurs de cookie normales sont de la forme CookieValue1234 alors vous pouvez le changer en head :CookieValue1234 et de vérifier si l'espace là-bas reviendra URL codé ou pas (ie revient comme "%20" ou "").

+0

Certainement la solution la plus sûre, vous pouvez mettre plusieurs caractères de test si vous voulez tester plusieurs encodages. –

Questions connexes