Welchen Charakter Ersetzungen sollten durchgeführt werden, um eine Basis-64-Codierung-URL sicher?

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

Frage

Im Blick auf die URL-safe base64-Codierung, die ich gefunden habe, dass es eine sehr nicht-standard-Sache.Trotz der reichlichen Anzahl von integrierten Funktionen, die PHP bietet, es ist nicht ein für URL-safe base64-Codierung.Auf der manual-Seite base64_encode(), die meisten Kommentare schlagen vor Verwendung dieser Funktion, eingewickelt mit strtr():

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

Das einzige Perl-Modul konnte ich in diesem Bereich finden ist MIME::Base64::URLSafe (Quelle), führt die folgenden Ersatz-intern:

sub encode ($) {
    my $data = encode_base64($_[0], '');
    $data =~ tr|+/=|\-_|d;
    return $data;
}

Im Gegensatz zu der PHP-Funktion vor, diese Perl-version fällt das '=' (gleich) - Zeichen vollständig, anstatt Sie zu ersetzen mit ',' (Komma) wie PHP funktioniert.Equals ist eine Polsterung Charakter, so das Perl-Modul ersetzt Sie bei Bedarf nach decodieren, aber dieser Unterschied macht die beiden Implementierungen nicht kompatibel.

Schließlich die Python-Funktion urlsafe_b64encode(s) hält das '=' padding herum, woraufhin jemand, sich zu setzen diese Funktion entfernen Sie die Polsterung, das zeigt sich prominent in der Google-Ergebnisse für 'python base64 url safe':

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

Der Wunsch ist dabei ein string, der kann in einer URL enthalten sein, ohne weitere Codierung, daher der Notwasserung oder die übersetzung der Zeichen'+', ' / ' und '='.Da gibt es nicht ein definierter standard, was ist der richtige Weg?

War es hilfreich?

Lösung

Es erscheint ein standard, es ist RFC 3548, Abschnitt 4 Base-64-Codierung mit URL und Dateiname Sicher Alphabet:

Diese Codierung ist technisch identisch zu dem vorherigen, mit Ausnahme der 62:nd und 63:rd alphabet Zeichen angegeben in Tabelle 2.

+ und / sollte ersetzt werden durch - (minus) und _ (understrike) bzw.Alle inkompatiblen Bibliotheken sollten eingewickelt werden, so dass Sie konform zu RFC 3548.

Beachten Sie, dass dies erfordert, dass Sie URL-codieren, die (pad) = Zeichen, aber ich bevorzuge, dass über die URL-Codierung der + und / Zeichen aus dem standard-base64 alphabet.

Andere Tipps

Ich glaube nicht, dass es richtig oder falsch ist.Aber die meisten beliebten Codierung

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

Dies ist weit verbreitet von Google, Yahoo (Sie nennen es Y64).Die meisten url-safe-version von Encodern, die ich verwendet, auf Java, Ruby unterstützt diesen Charakter legen.

Ich würde vorschlagen, läuft die Ausgabe der base64_encode durch urlencode.Zum Beispiel:

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

Wenn Sie Fragen über den richtigen Weg, würde ich gehen mit der richtigen URL-Kodierung im Gegensatz zu willkürlichen Ersetzung von Zeichen.Zunächst base64-Kodieren Sie Ihre Daten dann weiter codiert Sonderzeichen wie "=" mit der richtigen URL-Kodierung (d.h. %<code>).

Warum versuchen Sie nicht, wickeln Sie es in eine urlencode()?Dokumentation hier.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top