8
votes

Encodage de la valeur Cookie Java

Comment devez-vous encoder la valeur réelle d'un objet de cookie Java? Je ne peux pas passer des personnages comme '=' ou n'importe quel caractère à l'extérieur de US-ASCII.

/ br joynes


0 commentaires

5 Réponses :


9
votes

Peu importe comment, mais généralement base64 devrait bien fonctionner. < / Strike>

Une note de précaution:

Cela ressemble à vous souhaitez stocker des paramètres arbitraires dans un cookie. Ce n'est généralement pas une bonne idée, car les cookies (comme toute entrée de client) sont intraventés. Envisagez de stocker le côté du serveur de données sous certains identifiants générés (aléatoires!) Et la mettre dans le cookie. Ainsi, les gens ne peuvent pas contourner les restrictions d'accès ni injecter des données arbitraires dans votre système via des cookies manipulés.

Si vous ne pouvez pas utiliser cette approche, traitez les valeurs de cookie comme entrée non approuvée et vérifiez-la comme d'habitude.

Edit:

base64 n'est pas approprié, car il utilise "=", quels cookies Java ne supportent pas. Utilisez plutôt xxx

qui utilise uniquement des caractères appropriés pour les cookies.


9 commentaires

Remarque de note de précaution: il est possible de chiffrer le contenu des cookies si vous souhaitez empêcher les personnes de les manipuler mais ne veulent pas les stocker sur le serveur.


Pas vraiment lié à la question, mais crypter un cookie ne peut empêcher le client de les manipuler. Le cryptage ne se cachera que du client ce que le cookie contient réellement. Si vous avez besoin que le client ne puisse pas manipuler le contenu d'un cookie, vous devrez Signer IT et Vérifiez le côté serveur que le contenu correspond à la signature, lorsqu'un cookie est reçu d'un client.


@Jambjo: Eh bien, si le client manipule le contenu d'un cookie crypté, il déchiffrera des ordures aléatoires (au moins avec un algorithme de cryptage décent). Donc, bien que ce soit vrai, le client peut techniquement manipuler le cookie, il est peu probable qu'ils puissent réellement accomplir plus d'un DOS (toujours un point à considérer).


(suite) Si vous cryptez le cookie, vous n'avez pas besoin de signer la valeur. Un simple contrôle (chiffré le long des valeurs du cookie) suffit. Si la valeur cryptée est manipulée, la somme de contrôle ne correspond plus et la fixation est impossible sans la clé.


Je ne peux pas vraiment y aller avec la solution d'identifiant côté serveur en raison de raisons différentes. Je pourrais aller pour cryptage mais je n'ai pas vraiment besoin de cela. Si la base64 est suffisamment bonne, je peux utiliser cela aussi longtemps que ces caractères ne casse pas la valeur de la cookie (ne peuvent pas inclure des caractères comme = et ").


Un problème avec la solution BASE64 est qu'il inclut le caractère '='. Lorsque vous utilisez le cookie de classe en Java, il réduit la valeur lorsque vous rencontrez le caractère '='. Y a-t-il un meilleur codage?


@sleske: Il est difficile de dire ce que le serveur fera avec les données de cookie s'il est déchiffré à des ordures. Si le cookie ou une partie de celui-ci ne peut contenir qu'un nombre limité de valeurs réelles, par exemple "A" et "B", un client FONGUS a un cookie avec la valeur définie sur A et le serveur est implémenté comme "si cookie = a then ... autre ...", le client peut très bien pouvoir modifier le cookie et rendre le serveur à quelque chose qu'il ne devrait pas. En ce qui concerne la signature: quelle est la différence entre une somme de contrôle cryptée et une signature?


@jarnbjo: Vous avez raison, comptez sur des cookies modifiés qui sortent des ordures sont dangereuses.


En ce qui concerne la différence entre une somme de contrôle cryptée et une signature: une signature est généralement mise en œuvre à l'aide de la cryptographie de clé publique, tandis qu'une somme de contrôle cryptée pouvait utiliser une cryptographie symétrique. Mais il se résume vraiment à une question de définition ...



5
votes

Utilisez une version hexagonale ou URL-Safe de base64 pour le coder si vous avez des caractères dangereux. La base régulière64 ne peut pas être utilisée comme valeurs de cookie. Tomcat plus âgé permettait de laisser des caractères illégaux comme "=" mais les versions plus récentes commencent à appliquer les règles de cookie maintenant.


0 commentaires

-4
votes

My PHP Cookie Valeur Encodage fonction:

<?
function encode_cookie_value($value)
         {return strtr($value,
                       array_combine(str_split($tmp=",; \t\r\n\013\014"),
                                     array_map('rawurlencode', str_split($tmp))
                                    )
                      );
         }
setrawcookie('kk', encode_cookie_value('jk=jk?jk-/":jk;jk jk,jk'));
?>


2 commentaires

@eis, l'expression régulière est la clé


Ironiquement, la réponse «la plus fausse» est la seule si un peu de correction (les autres ne sont pas régulièrement régulières). base64 n'est pas ce que la spécification de cookie appelle. Ici, @diyism est la mappage de RawurlenCode, qui est la mauvaise méthode, mais des codes basés sur une spécification (pour URI), un cookie similaire doit être codé.



-2
votes

Comme je comprends que vous avez besoin de quelque chose comme ce nom de chaîne = "женя"; cookie cookie = nouveau cookie ("nom", nouvelle chaîne (nom_getbytes ("cp1251"), "utf8")); intervention.adddcookie ( Cookie);


1 commentaires

Cela va simplement corrompre les données.



2
votes

J'ai fini par utiliser le codage de base64 sans le rembourrage. Cela signifie que les signes égaux suivants sont omis, le problème est donc résolu.

Pour créer un encodeur de base64 sans rembourrage java.util.base64.gecoder (). Sans padding ()

Pour créer un décodeur de base64 sans rembourrage java.util.base64.gedecoder ()


0 commentaires