Quali sostituzioni di caratteri devono essere eseguite per rendere sicuro l'URL di codifica base 64?

StackOverflow https://stackoverflow.com/questions/1412391

Domanda

Osservando la codifica base 64 sicura dell'URL, l'ho trovata una cosa molto non standard. Nonostante il copioso numero di funzioni integrate di PHP, non ce n'è una per la codifica 64 sicura base URL. Nella pagina del manuale per base64_encode () , la maggior parte dei commenti suggerisce di utilizzare quella funzione, racchiusa con strtr () :

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

L'unico modulo Perl che ho trovato in quest'area è MIME :: Base64 :: URLSafe ( source ), che esegue internamente la seguente sostituzione:

sub encode ($) {
    my $data = encode_base64(

Osservando la codifica base 64 sicura dell'URL, l'ho trovata una cosa molto non standard. Nonostante il copioso numero di funzioni integrate di PHP, non ce n'è una per la codifica 64 sicura base URL. Nella pagina del manuale per base64_encode () , la maggior parte dei commenti suggerisce di utilizzare quella funzione, racchiusa con strtr () :

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

L'unico modulo Perl che ho trovato in quest'area è MIME :: Base64 :: URLSafe ( source ), che esegue internamente la seguente sostituzione:

from base64 import urlsafe_b64encode, urlsafe_b64decode

def uri_b64encode(s):
    return urlsafe_b64encode(s).strip('=')

def uri_b64decode(s):
    return urlsafe_b64decode(s + '=' * (4 - len(s) % 4))

A differenza della precedente funzione PHP, questa versione di Perl elimina del tutto il carattere '=' (uguale a), anziché sostituirlo con ',' (virgola) come fa PHP. Equals è un carattere di riempimento, quindi il modulo Perl li sostituisce come necessario al momento della decodifica, ma questa differenza rende le due implementazioni incompatibili.

Infine, la funzione Python urlsafe_b64encode (s) mantiene '=' che va in giro, spingendo qualcuno a mettere questa funzione per rimuovere l'imbottitura che mostra in modo evidente nei risultati di Google per ' python base64 url ??sicuro ":

<*>

Il desiderio qui è di avere una stringa che può essere inclusa in un URL senza ulteriore codifica, da cui la rimozione o la traduzione dei caratteri '+', '/' e '='. Poiché non esiste uno standard definito, qual è la strada giusta?

[0], ''); $data =~ tr|+/=|\-_|d; return $data; }

A differenza della precedente funzione PHP, questa versione di Perl elimina del tutto il carattere '=' (uguale a), anziché sostituirlo con ',' (virgola) come fa PHP. Equals è un carattere di riempimento, quindi il modulo Perl li sostituisce come necessario al momento della decodifica, ma questa differenza rende le due implementazioni incompatibili.

Infine, la funzione Python urlsafe_b64encode (s) mantiene '=' che va in giro, spingendo qualcuno a mettere questa funzione per rimuovere l'imbottitura che mostra in modo evidente nei risultati di Google per ' python base64 url ??sicuro ":

<*>

Il desiderio qui è di avere una stringa che può essere inclusa in un URL senza ulteriore codifica, da cui la rimozione o la traduzione dei caratteri '+', '/' e '='. Poiché non esiste uno standard definito, qual è la strada giusta?

È stato utile?

Soluzione

Sembra che ci sia uno standard, è RFC 3548 , Sezione 4, Codifica Base 64 con URL e nome file sicuro alfabeto :

  

Questa codifica è tecnicamente identica   a quello precedente, ad eccezione di   62: nd e 63: rd carattere alfabetico, come   indicato nella tabella 2.

+ e / devono essere sostituiti rispettivamente da - (meno) e _ (understrike) . Eventuali librerie incompatibili devono essere raggruppate in modo che siano conformi a RFC 3548.

Tieni presente che ciò richiede che l'URL codifichi i caratteri (pad) = , ma preferisco che su URL codifichi + e / caratteri dell'alfabeto base64 standard.

Altri suggerimenti

Non penso che ci sia giusto o sbagliato. Ma la codifica più popolare è

'+/=' => '-_.'

Questo è ampiamente usato da Google, Yahoo (lo chiamano Y64). La versione di encoder più sicura per gli URL che ho usato su Java, Ruby supporta questo set di caratteri.

Suggerirei di eseguire l'output di base64_encode tramite urlencode. Ad esempio:

function base64_encode_url( $str )
{
    return urlencode( base64_encode( $str ) );
}

Se mi stai chiedendo il modo corretto, sceglierei la codifica URL corretta anziché la sostituzione arbitraria di caratteri. Prima codifica base64 i tuoi dati, quindi codifica ulteriormente caratteri speciali come " = " con codifica URL corretta (ovvero % < code > ).

Perché non provi a racchiuderlo in un urlencode () ? Documentazione qui.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top