Karl Heinz: URL Encoding wann nötig bzw. sinnvoll?

Hallo,

ich habe eine Frage zu folgendem Wikipedia Artikel:

https://de.wikipedia.org/wiki/URL-Encoding

bzw. zu folgendem Tool:

https://www.urlencoder.org/

Kodiere ich mit dem oben verlinkten Tool die URL:

http://www.example.com/?utm_source=google&utm_campaign=organic

so erhalte ich die URL

http%3A%2F%2Fwww.example.com%2F%3Futm_source%3Dgoogle%26utm_campaign%3Dorganic

Im verlinkten Wikipedia Artikel steht u.a. folgendes:

Ohne diese Kodierung wären einige Informationen nicht in einer URL darstellbar.

Aus diesem Satz folgere ich, dass die oben genannte URL ohne die voherige Kodierung nicht als URL darstellbar wäre. Demnach muss man eine URL, zumindest laut Wikipedia Artikel, IMMER kodieren, damit die URL auch als URL darstellbar ist.

Andererseits kann ich oben genannte URL doch auch einwandfrei ohne URL Kodierung darstellen. Aus welchem Grund soll man z.B. das http:// so seltsam nach http%3A%2F%2 kodieren. http:// seht doch immer im Klartext in der Browser Adressleiste und nicht kodiert.

Das verwirrt mich etwas. Könnt Ihr mir in diesem Kontext erklären, wann man eine URL Kodieren muss, wann nicht bzw. welchen Nutzen das hat?

akzeptierte Antworten

  1. Da gibt es eine RFC welche Du sicher leicht finden wirst und der Grund liegt u.a. darin begründet, dass bestimmte Zeichen für den Enctype reserviert sind wie z.B. das Gleichheitszeichen und das Ampersand und noch ein paar weitere.

    --
    Lavendel ist blau.
    1. Da gibt es eine RFC welche Du sicher leicht finden wirst und der Grund liegt u.a. darin begründet, dass bestimmte Zeichen für den Enctype reserviert sind wie z.B. das Gleichheitszeichen und das Ampersand und noch ein paar weitere.

      Das & Zeichen finde ich häufig im Klartext in URLs, demnach kann es ja nicht reserviert sein, trotzdem wird das & Zeichen mit dem Tool zu %26 kodiert. Ich verstehe nicht warum, ein nicht reserviertes Zeichen dürfte doch eigentlich nicht kodiert werden.

      1. @@Karl Heinz

        Angenommen, die Parameter serie=Mascha&Bär und folge=42 [1] sollen im URI untergebracht werden.

        ?serie=Mascha&Bär&folge=42 – das wird wohl nichts. & ist hier ein Sonderzeichen mit der Bedeutung Trennzeichen der Parameter. Wenn & als solches gemeint ist, muss es escapet werden:

        ?serie=Mascha%26Bär&folge=42

        Mal davon abgesehen, dass & als Trennzeichen blöd ist (weil es auch im HTML ein Sonderzeichen ist und escapet werden muss) und ; sich besser macht:

        ?serie=Mascha%26Bär;folge=42

        LLAP 🖖

        --
        “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory

        1. Mascha und der Bär Folge 42 – großes Kino. ↩︎

      2. Hallo

        Das & Zeichen finde ich häufig im Klartext in URLs, demnach kann es ja nicht reserviert sein,

        Doch, das ist es.

        trotzdem wird das & Zeichen mit dem Tool zu %26 kodiert.

        Du vermischst hier zwei Dinge. Die Maskierung, wie du sie nennst, wird für Werte von URL-Parametern angewendet. Die Maskierung von &als %26 passt also auf ein „&“ als Bestandteil eines Parameterwerts wie z.B. eines Firmennamens „Meier & Sohn“, der als URL-Parameter wie folgt lautete.

        http://example.com/auswertung.php?firmenname=Meier%20%26%20Sohn
        

        Das Ampersand „&“ muss allerdings auch in HTML, z.B. als Bestandteil eben einer URL maskiert werden, weil es sonst als Beginn einer Zeichenentität wie z.B. $auml; für „ä“ oder & für „&“ interpretiert würde. Als URL, die im href-Attribut eines Links notiert wird, muss das Ampersand als Trennzeichen für mehrere URL-Parameter nach den HTML-Regeln maskiert werden. Die Maskierung innerhalb eines Parameterwerts bleibt davon unbenommen.

        http://example.com/auswertung.php?firmenname=Meier%20%26%20Sohn&plz=00001&ort=Bumsdorf
        

        Ich verstehe nicht warum, ein nicht reserviertes Zeichen dürfte doch eigentlich nicht kodiert werden.

        Es kommt auf den Kontext an, welche Zeichen maskiert werden müssen. Speziell das Ampersand hat, wie gezeigt, im Webbereich gleich (mindestens) zwei verschiedene Kontexte, in denen es auf unterschiedliche Weise zu maskieren ist.

        Tschö, Auge

        --
        Wenn man ausreichende Vorsichtsmaßnahmen trifft, muss man keine Vorsichtsmaßnahmen mehr treffen.
        Toller Dampf voraus von Terry Pratchett
  2. Hello,

    Du musst dabei auf jeden Fall zwischen der Kodierung für den URL-Kontext und der Kodierung für den HTML-Kontext unterscheiden.

    Wenn es sich später um eine URL handeln soll, müssen außer SCHEME und DOMAIN (dafür gelten eigene Regeln) alle weiteren Daten URL-kodiert werden. Ausgenommen davon sind im Parameter-String die Zeichen ?&;=, die dort eigene Bedeutung haben. Dabei legt der angefragte Webserver fest, ob er ein & oder ein ; oder noch ein anderes Zeichen zur Trennung von Parametern (Name=Value) haben will.

    Das bedeutet aber auch, dass man nicht einfach den kompletten String durch eine Kodierungsfunktion schicken darf, sondern dass man jeden Name und jeden Value separat kodieren muss. Ausnahme natürlich: die Kodierungsfunktion ist selber schlau genug, den String vorher zu parsen und jeden Name und jeden Value separat zu kodieren.

    Wenn Du nun diesen kodierten String in einen HTML-Kontext setzt, muss dieser hierfür noch einmal speziell dafür vorbereitet werden. Hier darf man dann aber (z. B. in PHP) die Funktion htmlspecialchars(?, ENT_QUOTES) benutzen. Vorher bitte den Script-Kontext für die allgemeine Kodierung (utf-8) setzen, oder auch diesen noch in htmlspecialchars() angeben!

    Das Ergebnis kannst Du dann in href="?" oder src="?" einsetzen. (?) steht hier für das Ergebnis.

    Für das Scheme und die Domain gelten eigene Regeln. So werden z. B. vom Browser automatisch bereits deutsche Umlaute im Domainnamen so kodiert, dass die sogenannten Puny-Codes entstehen.

    Bsp:

    Liebe Grüße
    Tom S.

    --
    Es gibt nichts Gutes, außer man tut es
    Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
  3. Hallo Karl Heinz,

    es beim Escapen immer auf den Kontext an. In URLs haben laut dem von dir verlinkten Wikipedia-Artikel die Zeichen : / ? # [ ] @ $ & ' ( ) * + , ; = in URLs eine besondere Bedeutung (mit # kann man IDs in einer Seite anspringen, mit ? leitet man die URL-Parameterliste ein, deren einzelne Paramter mit & getrennt werden.

    Nehmen wir als Beispiel die URL http://example.org/resolve.php?page=start#footer, sie könnte bedeuten, dass wir dem Skript resolve.php den Parameter „page“ mit dem Wert „start“ übergeben und dann den Browser anweisen, das Element mit der ID „footer“ anzuspringen. Angenommen, der Parameter „page“ hätte nun den Wert „#-tag“ und die URL würde so aussehen: http://example.org/resolve.php?page=#tag#footer, würde am Server bloß http://example.org/resolve.php?page= ankommen, weil nur der Teil vor dem ersten als Fragment-Identifier verstandenem # übermittelt wird. Man muss also zwischen der Raute als Wert in der URL und als Beginn des Fragment-Identifiers unterscheiden können. Folglich kodiert man die erste Raute, die nicht die Sonderbedeutung hat: http://example.org/resolve.php?page=%23tag#footer
    Natürlich muss diese Kodierung auf dem Server wieder rückgängig gemacht werden.

    Dein Verständnisproblem ist wahrscheinlich, dass du meinst, die ganze URL kodieren zu müssen, es geht aber lediglich darum, in URLs die Teile zu kodieren, die keine spezielle Bedeutung haben sollen. – In HTML ist es analog: Will ich <ironie> ausgeben, muss ich &lt;ironie&gt; schreiben, ich kodiere aber nicht das ganze HTML-Dokument:

    &lt;!doctype html&gt;
    &lt;html lang=&quot;de&quot;&gt;
      &lt;head&gt;
        &lt;meta charset=&quot;utf-8&quot;&gt;
        &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
        &lt;title&gt;Titel&lt;/title&gt;
      &lt;/head&gt;
      &lt;body&gt;
      &lt;/body&gt;
    &lt;/html&gt;
    

    Gruß
    Julius

    1. Hallo Julius,

      In HTML ist es analog: Will ich <ironie> ausgeben, muss ich &lt;ironie&gt; schreiben,

      Es reicht &lt;ironie>.

      Bis demnächst
      Matthias

      --
      Rosen sind rot.
  4. @@Karl Heinz

    Könnt Ihr mir in diesem Kontext erklären, wann man eine URL Kodieren muss, wann nicht bzw. welchen Nutzen das hat?

    Ein Beispiel, wo man URLs prozent-escapen muss, sind Data-URLs wie bspw. SVG in CSS. (Manche Browser verstehen das zwar auch ohne, aber eben nicht alle.)

    LLAP 🖖

    --
    “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory