È sicuro passare stringhe con codifica Base64 non elaborate tramite parametri GET?
È sicuro passare stringhe con codifica Base64 non elaborate tramite parametri GET?
Risposte:
No, dovresti codificarlo con l'URL, poiché le stringhe base64 possono contenere i caratteri "+", "=" e "/" che potrebbero alterare il significato dei tuoi dati - sembrano una sottocartella.
I caratteri base64 validi sono riportati di seguito.
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
Ci sono ulteriori specifiche base64. (Vedi la tabella qui per i dettagli). Ma essenzialmente hai bisogno di 65 caratteri per codificare: 26 minuscole + 26 maiuscole + 10 cifre = 62.
Hai bisogno di altri due ['+', '/'] e un carattere di riempimento '='. Ma nessuno di loro è url friendly, quindi usa solo caratteri diversi per loro e sei pronto. Quelli standard della tabella sopra sono ['-', '_'], ma potresti usare altri caratteri purché tu li abbia decodificati 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, '._-', '+/='));
}
urlencode
come suggerito dalla risposta di rodrigo-silveira. Creare due nuove funzioni per salvare pochi caratteri nella lunghezza dell'URL, è come entrare in casa passando attraverso la finestra invece di usare semplicemente la porta.
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
,
dovrebbe essere urlencoded to %2C
, suggerisco di usare al ._-
posto di -_,
like l'unica variante in en.wikipedia.org/wiki/Base64#Variants_summary_table che mantiene il trailing =
@joeshmo O invece di scrivere una funzione di supporto, potresti semplicemente urlencode la stringa codificata base64. Questo farebbe esattamente la stessa cosa della tua funzione di aiuto, ma senza la necessità di due funzioni extra.
$str = 'Some String';
$encoded = urlencode( base64_encode( $str ) );
$decoded = base64_decode( urldecode( $encoded ) );
/
carattere se lo passi non come parametro GET, ma come percorso nell'URL. Cambierà il tuo percorso se non lo sostituisci /
con qualcos'altro su entrambi i lati.
Nota introduttiva Sono propenso a pubblicare alcuni chiarimenti poiché alcune delle risposte qui erano un po 'fuorvianti (se non errate).
La risposta è NO , non puoi semplicemente passare 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 a
//test.php
print $_GET['myVar'];
il risultato sarebbe:
stringwith sign
Il modo più semplice per risolverlo è semplicemente la urlencode()
tua stringa base64 prima di aggiungerla alla stringa di query per sfuggire ai caratteri +, = e / ai codici% ##. Ad esempio, urlencode("stringwith+sign")
restituiscestringwith%2Bsign
Quando elabori l'azione, PHP si occupa di decodificare automaticamente la stringa di query quando popola il globale $ _GET. Ad esempio, se ho inviato test.php? MyVar = stringwith% 2Bsign a
//test.php
print $_GET['myVar'];
il risultato sarebbe:
stringwith+sign
Non si desidera urldecode()
la stringa $ _GET restituita poiché i + saranno convertiti in spazi.
In altre parole, se ho inviato lo stesso test.php? MyVar = stringwith% 2Bsign to
//test.php
$string = urldecode($_GET['myVar']);
print $string;
il risultato è un imprevisto:
stringwith sign
Sarebbe sicuro per rawurldecode()
l'input, tuttavia, sarebbe ridondante e quindi non necessario.
<br>
, quindi non è necessario digitare molto HTML. Spero che questo aiuti, ho modificato un po 'la tua risposta per migliorarla ancora di più.
Sì e no.
Il set di caratteri di base di base64 può in alcuni casi scontrarsi con convenzioni tradizionali utilizzate negli URL. Ma molte delle implementazioni di base64 ti consentono di cambiare il set di caratteri per abbinare meglio gli URL o addirittura venire con uno (come quello di Python urlsafe_b64encode()
).
Un altro problema che potresti incontrare è il limite della lunghezza dell'URL o piuttosto la mancanza di tale limite. Poiché gli standard non specificano alcuna lunghezza massima, browser, server, librerie e altri software che funzionano con il protocollo HTTP possono definire i propri limiti. Puoi dare un'occhiata a questo articolo: Domande frequenti sul WWW: qual è la lunghezza massima di un URL?
È 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 superi la lunghezza massima della stringa di query url e / oor 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 "==".
Per la codifica sicura degli URL, come base64.urlsafe_b64encode(...)
in Python il codice seguente, funziona per me al 100%
function base64UrlSafeEncode(string $input)
{
return str_replace(['+', '/'], ['-', '_'], base64_encode($input));
}
Sì, è sempre sicuro. ovviamente base64 contiene:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
ma una stringa codificata in base64 di solito non ha +
. +
verrà convertito in uno spazio vuoto, con conseguente stringa decodificata errata. /
è sicuro in una coppia di parametri get. =
è sempre alla fine della stringa codificata base64 e il lato server può risolvere =
direttamente.