Frage

Sind eckige Klammern in URLs erlaubt?

Ich bemerkte, dass Apache Commons HttpClient (3.0.1) löst eine IOException aus, wget und Firefox akzeptieren jedoch eckige Klammern.

URL-Beispiel:

http://example.com/path/to/file[3].html

Mein HTTP-Client stößt auf solche URLs, aber ich bin mir nicht sicher, ob ich den Code patchen oder eine Ausnahme auslösen soll (wie es eigentlich sein sollte).

War es hilfreich?

Lösung

RFC 3986 Zustände

Ein Host, der von einem Internet-Host identifiziert wird Protokollliteraladresse, Version 6 [RFC3513] oder höher wird unterschieden durch Einschließen des IP-Literals in eckige Klammern ("[" und "]").Das ist die einzige Stelle, an der eckige Klammern Zeichen sind im URI zulässig Syntax.

Daher sollten Sie solche URIs theoretisch nicht in freier Wildbahn sehen, da sie verschlüsselt ankommen sollten.

Andere Tipps

Ich weiß, dass diese Frage etwas alt ist, aber ich wollte nur darauf hinweisen, dass PHP Klammern verwendet, um Arrays in einer URL zu übergeben.

http://www.example.com/foo.php?bar[]=1&bar[]=2&bar[]=3

In diesem Fall $_GET['bar'] wird beinhalten array(1, 2, 3).

Jeder Browser oder jede webfähige Software, die URLs akzeptiert und bei der Einführung von Sonderzeichen keine Ausnahme auslöst, kodiert die Sonderzeichen mit ziemlicher Sicherheit im Hintergrund.Geschweifte Klammern, eckige Klammern, Leerzeichen usw. verfügen alle über spezielle codierte Darstellungsmöglichkeiten, um keine Konflikte zu erzeugen.Gemäß den vorherigen Antworten besteht der sicherste Weg, damit umzugehen, darin, sie per URL zu kodieren, bevor man sie an etwas weitergibt, das versucht, die URL aufzulösen.

So ziemlich die einzigen Zeichen, die in Pfadnamen nicht erlaubt sind, sind # und ?denn sie bedeuten das Ende des Weges.

Die uri rfc wird die endgültige Antwort haben:

http://www.ietf.org/rfc/rfc1738.txt

Unsicher:

Charaktere können aus mehreren Gründen unsicher sein.Der Raum Zeichen unsicher ist, weil signifikante Leerzeichen verschwinden können und unbedeutende Leerzeichen können eingefügt werden, wenn URLs transkribiert werden oder gesetzt oder der Bearbeitung von Textverarbeitungsprogrammen unterzogen werden.Die Zeichen "<" und ">" sind unsicher, da sie als Trennzeichen um URLs im Freitext;Das Anführungszeichen (""") wird verwendet, um URLs in einigen Systemen abgrenzen.Das Zeichen "#" ist unsicher und sollte immer kodiert sein, da es im World Wide Web und in anderen eine URL von einem Fragment-/Ankerbezeichner abzugrenzen, der Folgen Sie ihm.Das Zeichen "%" ist unsicher, da es für Kodierungen anderer Zeichen.Andere Zeichen sind unsicher, weil Es ist bekannt, dass Gateways und andere Transport-Agents gelegentlich solche Zeichen.Diese Zeichen sind "{", "}", "|", "\", "^", "~", "[", "]" und "'".

Alle unsicheren Zeichen müssen immer innerhalb einer URL codiert werden.Für z. B. muss das Zeichen "#" innerhalb von URLs kodiert werden, auch wenn Systeme, die normalerweise nicht mit Fragmenten oder Ankern umgehen Identifikatoren, so dass, wenn die URL in ein anderes System kopiert wird, verwendet wird, ist es nicht notwendig, die URL-Kodierung zu ändern.

Die Antwort ist, dass sie sollen hexadezimal codiert sein, aber wenn man das Postel-Gesetz kennt, werden die meisten Dinge sie wörtlich akzeptieren.

Für die Verwendung der HttpClient-Commons-Klasse sollten Sie sich die Klasse org.apache.commons.httpclient.util.URIUtil ansehen, insbesondere die Methode encode().Verwenden Sie es, um die URL mit einem URI zu kodieren, bevor Sie versuchen, sie abzurufen.

StackOverflow scheint sie nicht zu kodieren:

https://stackoverflow.com/search?q=square+brackets+[url]

Am besten ist es, diese per URL zu kodieren, da sie offensichtlich nicht auf allen Webservern unterstützt werden.Selbst wenn es einen Standard gibt, befolgen ihn manchmal nicht alle.

Entsprechend der URL-Angabe, die eckigen Klammern sind keine gültigen URL-Zeichen.

Hier sind die relevanten Ausschnitte:

Die Zeichen "national" und "Interpunktion" kommen in keiner Produktionen und erscheinen daher möglicherweise nicht in URLs.
national { | } | vline | [ | ] | \ | ^ | ~
Interpunktion < | >

Eckige Klammern [ Und ] in-URLs werden oft nicht unterstützt.

Ersetzen Sie sie durch %5B Und %5D:

  • Das folgende Beispiel basiert auf der Verwendung einer Befehlszeile bash Und sed:

    url='http://example.com?day=[0-3][0-9]'
    encoded_url="$( sed 's/\[/%5B/g;s/]/%5D/g' <<< "$url")"
    
  • Verwendung von Java URLEncoder.encode(String s, String enc)

  • Verwendung von PHP rawurlencode() oder urlencode()

    <?php
    echo '<a href="http://example.com/day/',
        rawurlencode('[0-3][0-9]'), '">';
    ?>
    

    Ausgabe:

    <a href="http://example.com/day/%5B0-3%5D%5B0-9%5D">
    

    oder:

    <?php
    $query_string = 'day=' . urlencode('[0-3][0-9]') .
                    '&month=' . urlencode('[0-1][0-9]');
    echo '<a href="http://example.com?',
          htmlentities($query_string), '">';
    ?>
    
  • Mit Ihrer bevorzugten Programmiersprache...Bitte erweitern Sie diese Antwort, indem Sie einen Kommentar posten oder diese Antwort direkt bearbeiten, um die von Ihnen verwendete Funktion aus Ihrer Programmiersprache hinzuzufügen ;-)

Weitere Einzelheiten finden Sie im RFC 3986 Angabe der URL-Syntax.Der Anhang A handelt von %-encoding in der Abfragezeichenfolge (Klammern wie zugehörig). „Gen-Delims“ zu sein %-encoded).

Eckige Klammern gelten als unsicher, werden aber von den meisten Browsern korrekt analysiert.Allerdings ist es besser, eckige Klammern durch andere Zeichen zu ersetzen.

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