2009-10-07 17 views
6

Come si deve codificare il valore effettivo per un oggetto Java Cookie? Non posso passare caratteri come '=' o qualsiasi carattere al di fuori degli US-ASCII.Codifica java Valore del cookie

/Br Joynes

risposta

8

Non ha veramente importa come, ma di solito Base64 dovrebbe funzionare bene.

una nota di cautela:

Questo suona come si desidera memorizzare le impostazioni arbitrarie in un cookie. Generalmente non è una buona idea, perché i cookie (come tutti gli input dei client) non sono attendibili. Prendi in considerazione la possibilità di archiviare i dati lato server sotto qualche identificatore (casuale!) Generato e inserendolo nel cookie. In questo modo le persone non possono eludere le restrizioni di accesso o iniettare dati arbitrari nel tuo sistema tramite cookie manipolati.

Se non è possibile utilizzare questo approccio, considerare i valori dei cookie come input non attendibili e verificarli normalmente.

Edit:

Base64 non è opportuno, in quanto utilizza "=", che i cookie Java non supportano. Piuttosto utilizzare

java.net.URLEncoder.encode 

che utilizza solo caratteri appropriati per i cookie.

+1

Una nota nota di cautela: E 'possibile crittografare il contenuto del cookie, se si vuole impedire alle persone di manipolare loro ma non vogliono memorizzarli sul server. – sfussenegger

+1

Non proprio correlato alla domanda, ma la crittografia di un cookie non può impedire al client di manipolarli. La crittografia non farà altro che nascondere al client ciò che il cookie contiene effettivamente. Se si richiede che il client non possa manipolare il contenuto di un cookie, sarà necessario _sign_ it e verificare sul lato server che il contenuto corrisponda alla firma, quando un cookie viene ricevuto da un client. – jarnbjo

+1

@jambjo: Beh, se il client manipola il contenuto di un cookie crittografato, decodificherà in modo casuale la spazzatura (almeno con qualsiasi algoritmo di crittografia decente). Quindi, mentre è vero che il client può manipolare tecnicamente il cookie, è improbabile che possano effettivamente realizzare più di un DOS (ancora un punto da considerare). – sleske

5

Utilizzare la versione esadecimale o protetta da URL di Base64 per codificarlo se si dispone di caratteri non sicuri. Base64 regolare non può essere utilizzato come valori di cookie. Tomcat meno recente consentiva di inserire caratteri illegali come "=" ma le versioni più recenti iniziano ad applicare le regole sui cookie ora.

-3

mio php funzione valore del cookie codificare:

<? 
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')); 
?> 
+0

non proprio valido per una domanda java, vero? – eis

+0

@eis, l'espressione regolare è la chiave – diyism

-2

come ho capito avete bisogno di qualcosa di simile String name = "Женя"; Cookie biscotto = new Cookie ("nome", new String (name.getBytes ("CP1251"), "utf8")); response.addCookie (cookie);

+2

Ciò danneggerà solo i dati. – McDowell

1

Ho finito per usare la codifica Base64 senza il padding. Ciò significa che i segni uguali finali sono omessi, quindi il problema è risolto.

Per creare un free-padding Base64 Encoder java.util.Base64.getEncoder().withoutPadding()

Per creare un decoder Base64 senza imbottitura java.util.Base64.getDecoder()