Ist ein Doppelpunkt `:` sicher für die Verwendung von Friendly-URLs?


109

Wir entwerfen ein URL-System, das Anwendungsabschnitte als durch Schrägstriche getrennte Wörter angibt. Dies ist insbesondere in GWT der Fall, sodass sich die relevanten Teile der URL im Hash befinden (der von einer Controller-Schicht auf der Clientseite interpretiert wird):

http://site/gwturl#section1/section2

Einige Abschnitte benötigen möglicherweise zusätzliche Attribute, die wir mit a angeben möchten :, damit die Abschnittsteile der URL eindeutig sind. Der Code würde zuerst auf /und dann :wie folgt aufgeteilt:

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

Natürlich tun wir dies aus Gründen der URL-Freundlichkeit. Daher möchten wir sicherstellen, dass keines dieser Zeichen, die eine besondere Bedeutung haben, von Browsern oder einem anderen System URL-codiert wird und am Ende eine URL wie diese enthält Dies:

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

Ist die Verwendung des Doppelpunkts auf diese Weise sicher (was bedeutet, dass er nicht automatisch codiert wird) für Browser, Lesezeichen-Systeme, sogar Javascript oder Java-Code?


Vielleicht ist es eine gute Idee, (klarer) anzugeben, dass Sie die URLs nur auf der Clientseite verwenden? Da viele der Antworten (wie meine) davon ausgehen, dass Sie die URL über HTTP an einen Server senden.
Veger

Bearbeitet, um zu verdeutlichen, dass die Verwendung des Fragments auf der Clientseite erfolgt.
Nicole

Ich bin neugierig: Hat dieses URL-Schema nach 10 Monaten für Sie funktioniert? Ich denke darüber nach, dasselbe Schema zu verwenden.
Jonathan Swinney

1
@ Jonathan Swinney, leider bin ich von diesem Projekt (und der Firma) weitergegangen, obwohl mich die Antworten hier davon überzeugt haben, dass es der richtige Weg ist. Wenn ich ein neues Projekt starten würde, würde ich dieses Schema verwenden, aber ich würde es auch verwenden, #!um anzuzeigen, dass die Seiten statusbehaftet sind - siehe googlewebmastercentral.blogspot.com/2009/10/… (Dieser Vorschlag wurde eingehalten von starken AJAX-Nutzern wie Facebook)
Nicole

Ich habe gerade herausgefunden, dass WhatsApp eine URL im ersten Doppelpunkt schneidet, sodass beispielsweise eine Google Maps-URL unbrauchbar wird. Also ja, es ist wichtig, ihm zu entkommen.
Petruza

Antworten:


82

Ich habe vor kurzem schrieb einen URL - Encoder, so dass diese ziemlich frisch in meinem Kopf ist.

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

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

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 irreputable die richtige Antwort, wenn er darauf hinweist, dass die HTML 4-Spezifikation Elementnamen / Bezeichner einschränkt .

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


Ich denke, Sie haben etwas vor. Können Sie das etwas näher erläutern? Das Nicht-Senden an den Server ist kein Problem, da wir GWT verwenden. Ich bin mir nur nicht sicher, ob mir die Syntax in dem von Ihnen zitierten Abschnitt klar ist.
Nicole

Aber :ist ein Gen-Delim, kein Sub-Delim.
Bobince

1
Das Semikolon ist für einen pchar legal, also ist es kein Problem, ob es sich um ein Sub-Delim oder ein Gen-Delim handelt
Veger

@bobince - :ist in pchar, was in ist fragment, also :ist erlaubt. @Renesis - Wikipedia hat einen Artikel über ABNF en.wikipedia.org/wiki/ABNF Sie sehen sich im Grunde eine Liste zulässiger Zeichen an, wobei OR/ bedeutet . Ich habe keine GWT-Programmierung durchgeführt, daher weiß ich nicht, wie der Fragmentteil von URIs verwendet wird.
McDowell

Eine letzte Frage: Haben Sie einen Einblick in die reale Anwendung dieser Spezifikation? Bedeutet dies, dass Browser das :im Fragment ignorieren sollten / werden (die Codierung überspringen) ?
Nicole

59

Denken Sie neben der McDowell-Analyse zum URI-Standard auch daran, 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 können 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 ein illegales Zeichen ist, sondern auch, weil das Fragment char-by-char mit dem Ankernamen übereinstimmen muss. Daher sollte kein Agent versuchen, sie in irgendeiner Weise zu manipulieren.

Sie müssen es jedoch 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 erstellt. Was auch immer in der realen Welt implementiert ist, gewinnt am Ende des Tages.


58

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

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


31
Relevanteste Antwort. Wir alle wissen, dass das, was in den Spezifikationen steht, wenig mit der Realität in der Webentwicklung zu tun hat. Sie werden keine viel bessere Garantie für "Sicherheit" erhalten als "eine der 10 besten Websites der Welt".
Steven Collins

1
@StevenCollins Nicht relevanter als die Antwort, die 3 Jahre vor dieser Antwort gegeben wurde und genau dasselbe aussagt :)
Martin James

7

Ich würde nicht darauf zählen. Die URL wird wahrscheinlich wie %3Avon vielen Benutzeragenten codiert .


1
@arbales: Ja. Einige weniger konforme Benutzeragenten lassen nicht konforme URLs schmucklos.
Asaph

4

Aus URLEncoderJavadoc:

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

Beim Codieren eines Strings gelten die folgenden 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 mithilfe eines Codierungsschemas 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 ist, wird die Standardcodierung der Plattform verwendet.

Das heißt, :ist nicht sicher.


3

Ich sehe nicht, dass Firefox oder IE8 einige der Wikipedia- URLs codieren , die das Zeichen enthalten.


1
Opera behält auch das Semikolon, aber auf ein solches Verhalten zu zählen ist keine gute Sache
Veger

1
Renesis spricht über das URL-Fragment und nicht über den URL-Pfad.
Gumbo

Wikipedia war einer meiner Gedanken beim Schreiben dieser Frage. Ist die Verwendung von Doppelpunkten dann technisch ungültig / unsicher? Ich sehe (und) häufig in Wikipedia verschlüsselte URLs, aber niemals den Doppelpunkt, was mich etwas verwirrt hat.
Nicole

3
Die Wayback-Maschine hat eine: in vielen ihrer Links - zB web.archive.org/web/20080822150704/http://stackoverflow.com
barrowc

2

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


0

Doppelpunkt ist nicht sicher. Siehe hier


Diese Seite motiviert nicht, warum sie nicht sicher sind. Der referenzierte RFC2396 sagt auch nicht, dass er maskiert werden soll. Das bereitgestellte Konverterskript codiert es auch nicht (in Chrome 9 sowieso).
Adam Lindberg

Adam, du bist falsch. Es gibt direkt an, was und warum.
Ktamlyn

-5

Es ist kein sicheres Zeichen und wird verwendet, um zu unterscheiden, mit welchem ​​Port Sie eine Verbindung herstellen, wenn er sich direkt nach Ihrem Domainnamen befindet

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.