webentwicklung-frage-antwort-db.com.de

Übergabe von Base64-codierten Zeichenfolgen in URL

Ist es sicher, unformatierte base64-codierte Zeichenfolgen über GET-Parameter zu übergeben?

224
Alix Axel

Nein, Sie müssten es url-codieren, da base64-Strings die Zeichen "+", "=" und "/" enthalten können, die die Bedeutung Ihrer Daten verändern könnten - sehen aus wie ein Unterordner.

Gültige base64-Zeichen finden Sie weiter unten.

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
193
Thiyagaraj

Es gibt zusätzliche base64-Spezifikationen. (Einzelheiten finden Sie in der Tabelle hier ). Grundsätzlich benötigen Sie jedoch 65 Zeichen für die Codierung: 26 Kleinbuchstaben + 26 Großbuchstaben + 10 Ziffern = 62.

Sie benötigen zwei weitere ['+', '/'] und ein Füllzeichen '='. Aber keine von ihnen ist url-freundlich, also benutze einfach verschiedene Zeichen für sie und du bist bereit. Die Standardzeichen aus der obigen Tabelle sind ['-', '_'], aber Sie können andere Zeichen verwenden, solange Sie sie gleich dekodieren und müssen sie nicht mit anderen teilen.

Ich würde nur empfehlen, eigene Helfer zu schreiben. Wie diese aus den Kommentaren auf der PHP-Handbuchseite für base64_encode :

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

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

@joeshmo Oder anstatt eine Hilfsfunktion zu schreiben, könnten Sie einfach den base64-codierten String urlencodieren. Dies würde genau das Gleiche tun wie Ihre Hilfsfunktion, jedoch ohne die Notwendigkeit von zwei zusätzlichen Funktionen.

$str = 'Some String';

$encoded = urlencode( base64_encode( $str ) );
$decoded = base64_decode( urldecode( $encoded ) );
70

Introductory Note Ich bin geneigt, ein paar Erklärungen zu posten, da einige der Antworten hier etwas irreführend waren (wenn nicht falsch).

Die Antwort lautet NEIN . Sie können einen base64-codierten Parameter nicht einfach in einer URL-Abfragezeichenfolge übergeben, da Pluszeichen in ein LEERZEICHEN innerhalb des globalen Arrays $ _GET konvertiert werden . Mit anderen Worten, wenn Sie test.php? MyVar = stringwith + sign an gesendet haben

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

das Ergebnis wäre:
stringwith sign

Die einfache Möglichkeit, dies zu lösen, besteht darin, einfach Ihre base64-Zeichenfolge urlencode() vor dem Hinzufügen zur Abfragezeichenfolge hinzuzufügen, um die Zeichen +, = und/an den% ## -Codes zu ersetzen. Beispielsweise gibt urlencode("stringwith+sign")stringwith%2Bsign zurück.

Wenn Sie die Aktion ausführen, dekodiert PHP automatisch die Abfragezeichenfolge, wenn das globale $ _GET-Objekt gefüllt wird. Wenn ich beispielsweise test.php? MyVar = stringwith% sende 2Bsign bis

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

das Ergebnis wäre:
stringwith+sign

Sie möchten nichturldecode() den zurückgegebenen $ _GET-String als + in Leerzeichen konvertieren.
Mit anderen Worten, wenn ich die gleiche test.php? MyVar = Zeichenfolge mit% 2Bsign an gesendet habe

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

das Ergebnis ist ein unerwartetes:
stringwith sign

Es wäre sicher, rawurldecode() den Eingang zu verwenden, er wäre jedoch redundant und daher nicht erforderlich.

38

Ja und nein.

Der grundlegende Zeichensatz von base64 kann in einigen Fällen mit den in URLs verwendeten herkömmlichen Konventionen kollidieren. Bei vielen Base64-Implementierungen können Sie den Zeichensatz jedoch so ändern, dass er besser mit URLs übereinstimmt, oder sogar mit einem (wie Pythons urlsafe_b64encode() ).

Ein weiteres Problem, mit dem Sie möglicherweise konfrontiert sind, ist die Begrenzung der URL-Länge bzw. das Fehlen einer solchen Begrenzung. Da Standards keine maximale Länge festlegen, können Browser, Server, Bibliotheken und andere Software, die mit dem HTTP-Protokoll arbeiten, ihre eigenen Grenzen definieren. Sie können sich diesen Artikel ansehen: WWW-FAQs: Was ist die maximale Länge einer URL?

13
Michał Górny

Es ist eine Base64URL-Codierung, die Sie ausprobieren können, und eine Erweiterung des obigen Joeshmo-Codes.

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

Ich denke nicht, dass dies sicher ist, weil z. Das Zeichen "=" wird in der unformatierten Basis 64 verwendet und wird auch zum Unterscheiden der Parameter von den Werten in einem HTTP-GET verwendet.

4
Mischa

Theoretisch ja, solange Sie die maximale URL- und/oder Abfragezeichenfolgenlänge für den Client oder Server nicht überschreiten.

In der Praxis kann es etwas kniffliger werden. Beispielsweise kann eine HttpRequestValidationException in ASP.NET ausgelöst werden, wenn der Wert zufällig ein "on" enthält und Sie das nachfolgende "==" belassen.

1
Nicole Calinoiu