Übergeben von base64-codierten Zeichenfolgen in URL

Lesezeit: 7 Minuten

Ubergeben von base64 codierten Zeichenfolgen in URL
Alix Axel

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

  • Nein, ist es nicht – die verknüpfte Frage ist neuer. Dadurch wird die verknüpfte Frage zu einem Duplikat dieser Frage …

    – serge

    8. März 2017 um 23:11 Uhr

  • @serge Welche?

    – Stapelschutz

    25. September 2021 um 9:06 Uhr

Ubergeben von base64 codierten Zeichenfolgen in URL
Joe Flynn

Es gibt zusätzliche base64-Spezifikationen. (Siehe Tabelle Hier für Besonderheiten). Aber im Wesentlichen benötigen Sie 65 Zeichen zum Codieren: 26 Kleinbuchstaben + 26 Großbuchstaben + 10 Ziffern = 62.

Du brauchst noch zwei [‘+’, “https://stackoverflow.com/”] und ein Füllzeichen ‘=’. Aber keiner von ihnen ist URL-freundlich, also Verwenden Sie einfach andere Zeichen für sie und du bist bereit. Die Standard aus der obigen Tabelle sind [‘-‘, ‘_’]aber Sie können andere Zeichen verwenden, solange Sie sie gleich dekodieren und nicht mit anderen teilen müssen.

Ich würde empfehlen, einfach eigene Helfer zu schreiben. Wie diese aus den Kommentaren zu den 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, '._-', '+/='));
}

  • Großartige Lösung, außer dass das Komma in URLs nicht uneingeschränkt ist. Ich empfehle die Verwendung von ‘~’ (Tilde) oder ‘.’ (Punkt) statt.

    – kralyk

    1. Februar 2013 um 14:19 Uhr

  • @kralyk: Ich empfehle nur die Verwendung urlencode wie in Rodrigo-Silveiras Antwort vorgeschlagen. Erstellen Sie zwei neue Funktionen, um wenige Zeichen in der URL-Länge einzusparen. Es ist, als würden Sie Ihr Haus durch das Fenster betreten, anstatt nur die Tür zu benutzen.

    – Marco Demaio

    26. Februar 2014 um 11:27 Uhr

  • @MarcoDemaio, ohne zu wissen, wie es verwendet wird, ist es unmöglich zu sagen, dass es nur ein paar Zeichen sind. Jedes codierte Zeichen hat die dreifache Länge, und warum sollte “+++…” keine gültige Base64-Zeichenfolge sein? URLs haben Browserbeschränkungen, und das Verdreifachen einer URL kann dazu führen, dass Sie diese Beschränkungen erreichen.

    – leewz

    4. September 2015 um 18:44 Uhr

  • @RandalSchwartz tilde ist URL-sicher. Aus RFC3986: unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"

    – kralyk

    30. September 2015 um 10:53 Uhr

  • Seit , sollte urlencodiert werden %2Cempfehle ich die Verwendung ._- anstatt -_, wie die einzige Variante in en.wikipedia.org/wiki/Base64#Variants_summary_table das hält das abschließende =

    – PaulH

    3. Juli 2016 um 12:26 Uhr

Nein, Sie müssten es per URL codieren, da base64-Strings die Zeichen „+“, „=” und „https://stackoverflow.com/“ enthalten können, die die Bedeutung Ihrer Daten verändern könnten – sehen aus wie ein Sub- Mappe.

Gültige base64-Zeichen sind unten aufgeführt.

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=

  • URL-Kodierung ist Platzverschwendung, zumal base64 selbst viele Zeichen ungenutzt lässt.

    – Michał Górny

    3. September 2009 um 18:34 Uhr

  • Ich bin mir nicht sicher, ob ich verstehe, was Sie sagen – die URL-Codierung ändert keines der Zeichen außer den letzten drei Zeichen in der obigen Liste, und das soll verhindern, dass sie falsch interpretiert werden, da sie in URLs andere Bedeutungen haben. Dasselbe gilt für base64, die ursprünglichen Daten können binär oder irgendetwas anderes sein, aber sie sind in einer Form codiert, die mit einfachen Protokollen leicht übertragen werden kann.

    – Thiyagaraj

    3. September 2009 um 19:42 Uhr

  • Erstens sollten Sie auch ‘+’ entkommen, da es in Leerzeichen umgewandelt werden kann. Zweitens gibt es zumindest einige Zeichen, die sicher in URLs verwendet werden können und nicht im „Standard“-Zeichensatz verwendet werden. Ihre Methode kann sogar die Größe der übertragenen Daten erhöhen drei Mal in bestimmten Situationen; während das Ersetzen dieser Zeichen durch andere den Zweck erfüllt, während die gleiche Länge beibehalten wird. Und es ist auch eine Standardlösung.

    – Michał Górny

    3. September 2009 um 20:58 Uhr

  • en.wikipedia.org/wiki/Base64#URL_applications — es heißt deutlich, dass das Escape ‘die Zeichenkette unnötig länger macht’ und erwähnt die alternative Zeichensatzvariante.

    – Michał Górny

    3. September 2009 um 23:02 Uhr

  • @MichałGórny Wenn Sie JSON als GET-Parameter verwenden, reduziert die Base 64-Codierung (abhängig von Ihren Daten) wahrscheinlich die Größe der Anforderungszeichenfolge. (Und bevor Sie sagen, dass dies eine dumme Idee ist, wir verwenden JSON in Abfragezeichenfolgen, um das Deep-Linking in unsere App zu erleichtern.) Für unsere App erzielte dieser Ansatz eine Reduzierung von etwa 30 %. (Um fair zu sein, eine noch größere Reduzierung könnte erreicht werden, indem man Base64 vollständig vermeidet und stattdessen unsere eigenen JSON-(De-)Serialisierer schreibt, die URL-kodierungsfreundliche Zeichen verwenden (z ([' instead of {[").

    – rinogo

    Oct 26, 2015 at 20:28

@joeshmo Or instead of writing a helper function, you could just urlencode the base64 encoded string. This would do the exact same thing as your helper function, but without the need of two extra functions.

$str="Some String";

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

  • The result is not exactly the same. urlencode uses 3 characters to encode non-valid characters and joeshmo’s solution uses 1. It’s not a big difference, but it’s still a waste.

    – Josef Borkovec

    Mar 1, 2013 at 12:07

  • @JosefBorkovec Really? Then this would also mean the same number of bytes base64->url->encoded could be a variety of different resulting length, while the other solution gives a predictable lenght, right?

    – humanityANDpeace

    Mar 29, 2014 at 14:33

  • @humanityANDpeace Yes, urlencode is a shitty solution because it triples the size of certain base64 strings. You also can’t reuse the buffer since the output is larger than the input.

    – Navin

    Jan 6, 2016 at 10:13


  • Expansion from 1 to 3 chars occurs on 3 out of 64 characters on average, so it is a 9% overhead (2*3/64)

    – PaulH

    Jul 3, 2016 at 12:32

  • Be careful with / character if you pass it not as a GET parameter, but as a path in the URL. It will change your path if you don’t replace / with something else on both sides.

    – Tomasz Raganowicz

    Sep 1, 2017 at 11:15


1646948647 458 Ubergeben von base64 codierten Zeichenfolgen in URL
Jeffory J. Beckers

Introductory Note I’m inclined to post a few clarifications since some of the answers here were a little misleading (if not incorrect).

The answer is NO, you cannot simply pass a base64 encoded parameter within a URL query string since plus signs are converted to a SPACE inside the $_GET global array. In other words, if you sent test.php?myVar=stringwith+sign to

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

das Ergebnis wäre:
stringwith sign

Der einfache Weg, dies zu lösen, ist einfach urlencode() Ihre Base64-Zeichenfolge, bevor Sie sie der Abfragezeichenfolge hinzufügen, um die Zeichen +, = und / in %##-Codes zu maskieren. Zum Beispiel, urlencode("stringwith+sign") kehrt zurück stringwith%2Bsign

Wenn Sie die Aktion verarbeiten, kümmert sich PHP automatisch um die Dekodierung der Abfragezeichenfolge, wenn es das globale $_GET füllt. Zum Beispiel, wenn ich gesendet habe test.php?myVar=stringwith%2Bsign zu

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

das Ergebnis wäre:
stringwith+sign

Sie machen nicht möchte urldecode() Der zurückgegebene $_GET-String wird als + in Leerzeichen umgewandelt.
Mit anderen Worten, wenn ich das gleiche gesendet habe test.php?myVar=stringwith%2Bsign zu

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

das Ergebnis ist ein unerwartetes:
stringwith sign

Es wäre sicher rawurldecode() die Eingabe wäre jedoch redundant und damit unnötig.

Ubergeben von base64 codierten Zeichenfolgen in URL
Michal Gorny

Ja und nein.

Der grundlegende Zeichensatz von base64 kann in einigen Fällen mit traditionellen Konventionen kollidieren, die in URLs verwendet werden. Aber viele der base64-Implementierungen erlauben es Ihnen, den Zeichensatz zu ändern, um besser mit URLs übereinzustimmen, oder kommen sogar mit einem (wie Pythons urlsafe_b64encode()).

Ein weiteres Problem, mit dem Sie möglicherweise konfrontiert sind, ist die Begrenzung der URL-Länge oder besser gesagt das Fehlen einer solchen Begrenzung. Da Standards keine maximale Länge angeben, können Browser, Server, Bibliotheken und andere Software, die mit dem HTTP-Protokoll arbeiten, ihre eigenen Grenzen definieren.

1646948648 963 Ubergeben von base64 codierten Zeichenfolgen in URL
Andy

Es ist eine base64url-Codierung, die Sie ausprobieren können, es ist nur eine Erweiterung des obigen Codes von joeshmo.

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

1646948648 331 Ubergeben von base64 codierten Zeichenfolgen in URL
Mischa

Ich denke nicht, dass dies sicher ist, da zB das Zeichen “=” in Raw Base 64 verwendet wird und auch zur Unterscheidung der Parameter von den Werten in einem HTTP GET verwendet wird.

989070cookie-checkÜbergeben von base64-codierten Zeichenfolgen in URL

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy