wake-up-neo.com

Ist ein Doppelpunkt `:` sicher für die Verwendung mit freundlichen URLs?

Wir entwerfen ein URL-System, bei dem Anwendungsbereiche als durch Schrägstriche getrennte Wörter angegeben werden. Dies ist insbesondere in GWT der Fall, daher befinden sich die relevanten Teile der URL im Hash (der von einer Controller-Ebene auf der Clientseite interpretiert wird):

http://site/gwturl#section1/section2

Für einige Abschnitte sind möglicherweise zusätzliche Attribute erforderlich, die wir mit einem : Angeben möchten, damit die Abschnitte der URL eindeutig sind. Der Code wird zuerst auf / Und dann auf : Aufgeteilt:

http://site/gwturl#user:45/comments

Natürlich tun wir dies aus Gründen der Url-Freundlichkeit. Deshalb möchten wir sicherstellen, dass keines dieser Zeichen, das eine besondere Bedeutung hat, von Browsern oder einem anderen System url-codiert wird und am Ende eine URL wie diese aufweist Dies:

http://site/gwturl#user%3A45/comments <--- BAD

Verwendet den Doppelpunkt auf diese Weise sicher (womit ich meine, wird nicht automatisch verschlüsselt) für Browser, Bookmarking-Systeme, sogar Javascript oder Java Code?

100
Nicole

Ich habe vor kurzem schrieb einen URL-Encoder, das ist also ziemlich frisch in meinem Kopf.

http://site/gwturl#user:45/comments

Alle Zeichen im Fragmentteil (user:45/comments) sind für RFC 3986 URIs vollkommen legal.

Die relevanten Teile des ABNF :

fragment      = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
                 / "*" / "+" / "," / ";" / "="

Abgesehen von diesen Einschränkungen hat der Fragmentteil keine definierte Struktur, die über die von Ihrer Anwendung angegebene hinausgeht. Das Schema http besagt nur, dass Sie diesen Teil nicht an den Server senden.


BEARBEITEN:

D'oh!

Trotz meiner Behauptungen bezüglich der URI-Spezifikation liefert nwiderlegbar die richtige Antwort, wenn er weist darauf hin dass die HTML 4-Spezifikation Elementnamen/Bezeichner einschränkt .

Beachten Sie, dass die Bezeichnerregeln in HTML 5 geändert ​​sind. Es gelten weiterhin URI-Einschränkungen (zum Zeitpunkt des Schreibens gibt es einige ungelöste Probleme bei der Verwendung von URIs in HTML 5).

74
McDowell

Beachten Sie neben der McDowell-Analyse zum URI-Standard auch, dass das Fragment ein gültiger HTML-Ankername sein muss. Laut http://www.w3.org/TR/html4/types.html#type-name

ID- und NAME-Token müssen mit einem Buchstaben ([A-Za-z]) beginnen und dürfen von einer beliebigen Anzahl von Buchstaben, Ziffern ([0-9]), Bindestrichen ("-") und Unterstrichen ("_") gefolgt werden. , Doppelpunkte (":") und Punkte (".").

Sie haben also Glück. ":" ist ausdrücklich erlaubt. Und niemand sollte "%" - entkommen, nicht nur, weil "%" dort illegal ist, sondern auch, weil Fragmente viel mit dem Ankernamen char-by-char übereinstimmen, daher sollte kein Agent versuchen, mit ihnen auf jeden Fall zu temperieren.

Allerdings muss man es testen. Webstandards werden nicht strikt befolgt, manchmal sind die Standards widersprüchlich. Beispielsweise lässt HTTP/1.1 RFC 2616 keine Abfragezeichenfolge in der Anforderungs-URL zu, während HTML beim Senden eines Formulars mit der GET-Methode eine solche erstellt. Was auch immer in der realen Welt implementiert ist, gewinnt am Ende des Tages.

56
irreputable

MediaWiki und andere Wiki-Engines verwenden Doppelpunkte in ihren URLs, um Namespaces zu kennzeichnen, ohne größere Probleme.

zB http://en.wikipedia.org/wiki/Template:Welcome

54
Paul Wray

Ich würde mich nicht darauf verlassen. Die URL wird wahrscheinlich als %3A von vielen User-Agents.

7
Asaph

Von URLEncoder javadoc:

Weitere Informationen zur HTML-Formularcodierung finden Sie in HTML Spezifikation .

Beim Codieren eines Strings gelten folgende Regeln:

  • Die alphanumerischen Zeichen "a" bis "z", "A" bis "Z" und "0" bis "9" bleiben gleich.
  • Die Sonderzeichen ".", "-", "*" und "_" bleiben gleich.
  • Das Leerzeichen "" wird in ein Pluszeichen "+" umgewandelt.
  • Alle anderen Zeichen sind unsicher und werden zuerst mit einem Codierungsschema in ein oder mehrere Bytes konvertiert. Dann wird jedes Byte durch die 3-stellige Zeichenfolge "% xy" dargestellt, wobei xy die zweistellige hexadezimale Darstellung des Bytes ist. Das empfohlene Codierungsschema ist UTF-8. Wenn jedoch aus Kompatibilitätsgründen keine Codierung angegeben wird, wird die Standardcodierung der Plattform verwendet.

Das ist, : ist nicht sicher.

4
axtavt

Ich sehe nicht, dass Firefox oder IE8 einige der Wikipedia RLs kodieren, die das Zeichen enthalten.

3
kprobst

Doppelpunkte werden als Aufteilung zwischen Benutzername und Kennwort verwendet, wenn für ein Protokoll eine Authentifizierung erforderlich ist.

3
JP Silvashy

Colon ist nicht sicher. siehe hier

0
Bob