[Php] Passando stringhe con codifica Base64 nell'URL



Answers

Ci sono ulteriori specifiche di base64. (Vedi la tabella here per le specifiche). Ma in sostanza hai bisogno di 65 caratteri per la codifica: 26 minuscole + 26 maiuscole + 10 cifre = 62.

Hai bisogno di altri due ['+', '/'] e un carattere di riempimento '='. Ma nessuno di loro è amico dell'URL, quindi usa solo caratteri diversi per loro e sei pronto. Quelli standard del grafico sopra sono ['-', '_'], ma potresti usare altri caratteri purché li decodifichi allo stesso modo e non sia necessario condividerli con altri.

Consiglierei solo di scrivere i tuoi aiutanti. Come questi dai commenti sulla pagina di manuale di php per base64_encode :

function base64_url_encode($input) {
 return strtr(base64_encode($input), '+/=', '._-');
}

function base64_url_decode($input) {
 return base64_decode(strtr($input, '._-', '+/='));
}
Question

È sicuro passare stringhe codificate in base Base64 tramite i parametri GET?




In teoria, sì, purché non si superi l'url massimo e / o la lunghezza della stringa di query per il client o il server.

In pratica, le cose possono diventare un po 'più complicate. Ad esempio, può attivare una HttpRequestValidationException su ASP.NET se il valore contiene un "on" e si lascia nel trailing "==".




Nota introduttiva Sono propenso a pubblicare alcuni chiarimenti in quanto alcune delle risposte qui sono state un po 'fuorvianti (se non errate).

La risposta è NO , non è possibile passare semplicemente un parametro codificato Base64 all'interno di una stringa di query URL poiché i segni più vengono convertiti in uno SPAZIO all'interno dell'array globale $ _GET. In altre parole, se hai inviato test.php? MyVar = stringwith + sign to

//test.php
print $_GET['myVar'];

il risultato sarebbe:
stringwith sign

Il modo più semplice per risolverlo è semplicemente urlencode() la stringa base64 prima di aggiungerla alla stringa di query per sfuggire ai codici +, = e / in% ##. Ad esempio, urlencode("stringwith+sign") restituisce stringwith%2Bsign

Quando elabori l'azione, PHP si occupa di decodificare automaticamente la stringa di query quando popola il $ _GET globale. Ad esempio, se ho inviato test.php? MyVar = stringwith% 2Bsign a

//test.php
print $_GET['myVar'];

il risultato sarebbe:
stringwith+sign

Non vuoi urldecode() la stringa $ _GET restituita come + 's sarà convertita in spazi.
In altre parole, se ho inviato lo stesso test.php? MyVar = stringwith% 2Bsign a

//test.php
$string = urldecode($_GET['myVar']);
print $string;

il risultato è inaspettato:
stringwith sign

Sarebbe sicuro di rawurldecode() l'input, tuttavia, sarebbe ridondante e quindi non necessario.




È una codifica base64url che puoi provare, è solo l'estensione del codice di joeshmo sopra.

function base64url_encode($data) {
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

function base64url_decode($data) {
return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
}



Links