php - Passando stringhe con codifica Base64 nell'URL



4 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, '._-', '+/='));
}
php url string get base64

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




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));
}



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 "==".






Related


Tags

php   url   string   get   base64