Kennt jemand die vollständige Liste der Zeichen, die in einem GET verwendet werden können, ohne codiert zu werden? Im Moment benutze ich AZ az und 0-9 ... aber ich suche nach der vollständigen Liste.
Ich bin auch daran interessiert, ob es eine Spezifikation für die bevorstehende Hinzufügung von chinesischen, arabischen URLs gibt (da dies offensichtlich einen großen Einfluss auf meine Frage haben wird).
!*'();:@&=+$,/?#[]
oder nicht reserviertA-Za-z0-9_.~-
(oder ein Prozentzeichen%
als Teil einer Prozentcodierung)REGEXP '[^]A-Za-z0-9_.~!*''();:@&=+$,/?#[%-]+'
, um eine URL-Zeichenfolge mit schlechten Zeichen zu finden. Vielleicht ist es auch für jemand anderen nützlich.Antworten:
Aus der RFC 1738- Spezifikation:
EDIT: Wie @Jukka K. Korpela richtig hervorhebt, wurde dieser RFC von RFC 3986 aktualisiert . Dies hat die für den Host gültigen Zeichen erweitert und verdeutlicht. Leider ist es nicht einfach zu kopieren und einzufügen, aber ich werde mein Bestes geben.
In der ersten übereinstimmenden Reihenfolge:
quelle
A-Za-z0-9_.-~
am Anfang dieser Antwort eine Liste nicht reservierter und reservierter Zeichen hinzufügen .!*'();:@&=+$,/?#[]
Es kann Zeit für Menschen sparenreserved = gen-delims / sub-delims gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
http://en.wikipedia.org/wiki/Percent-encoding#Types_of_URI_characters
Dies sind nicht reservierte RFC 3986- Zeichen (Abschnitt 2.3) sowie reservierte Zeichen (Abschnitt 2.2), wenn sie ihre besondere Bedeutung behalten müssen. Und auch ein Prozentzeichen als Teil einer Prozentcodierung.
quelle
The characters allowed in a URI are either reserved or unreserved (or a percent character as part of a percent-encoding)
Die vollständige Liste der 66 nicht reservierten Zeichen finden Sie in RFC3986 hier: http://tools.ietf.org/html/rfc3986#section-2.3
Dies ist ein beliebiges Zeichen im folgenden regulären Ausdruckssatz:
quelle
{}^\~
undbacktick
als unsicher eingestuft. Und RFC3986 listet \ aufgrund des Dateisystems als unsicher auf. Dies bedeutet,{}^
dass auch verwendet werden könnte.-
dass Sie der Zeichenklasse entkommen oder sie am Anfang oder Ende der Zeichenklasse[.-~]
Ich habe es getestet, indem ich meine Website (Apache) mit allen verfügbaren Zeichen auf meiner deutschen Tastatur als URL-Parameter angefordert habe:
Diese wurden nicht verschlüsselt:
Nicht verschlüsselt nach
urlencode()
:Nicht verschlüsselt nach
rawurlencode()
:Hinweis: Vor PHP 5.3.0 wegen RFC 1738
rawurlencode()
codiert . Dies wurde jedoch durch RFC 3986 ersetzt, sodass es jetzt sicher verwendet werden kann. Aber ich verstehe nicht, warum zum Beispiel durch codiert werden, weil sie in RFC 3986 nicht erwähnt werden.~
{}
rawurlencode()
Ein zusätzlicher Test, den ich durchgeführt habe, betraf die automatische Verknüpfung in Mail-Texten. Ich habe Mozilla Thunderbird, aol.com, Outlook.com, Gmail.com, gmx.de und yahoo.de getestet und sie haben URLs mit diesen Zeichen vollständig verknüpft:
Natürlich
?
war das auch verlinkt, aber nur wenn es einmal benutzt wurde.Einige Leute würden jetzt vorschlagen, nur die
rawurlencode()
Zeichen zu verwenden, aber haben Sie jemals gehört, dass jemand Probleme beim Öffnen dieser Websites hatte?Sternchen
http://wayback.archive.org/web/*/http://google.com
Doppelpunkt
https://en.wikipedia.org/wiki/Wikipedia:About
Plus
https://plus.google.com/+google
Am Zeichen, Doppelpunkt, Komma und Ausrufezeichen
https: //www.google.com/maps/place/USA/@36.2218457, ...
Aus diesem Grund sollten diese Zeichen ohne Probleme unverschlüsselt verwendet werden können. Natürlich sollten Sie
&;
wegen Codierungssequenzen wie nicht verwenden&
. Es gilt der gleiche Grund wie für%
die Codierung von Zeichen im Allgemeinen. Und=
da es einem Parameternamen einen Wert zuweist.Schließlich würde ich sagen, dass es in Ordnung ist, diese nicht codierten zu verwenden:
Wenn Sie jedoch zufällig generierte URLs erwarten, sollten Sie diese nicht verwenden
.!
, da diese das Ende eines Satzes markieren und einige E-Mail-Apps das letzte Zeichen der URL nicht automatisch verknüpfen. Beispiel:quelle
+
Zeichen vor allem :-DVon hier aus
quelle
Diese sind in RFC3986 aufgeführt . Siehe die gesammelten ABNF für URI , um zu sehen , was erlaubt ist und wo die Regex für das Parsen / Validierung.
quelle
RFC3986 definiert zwei Zeichensätze, die Sie in einem URI verwenden können:
Reservierte Zeichen :
:/?#[]@!$&'()*+,;=
Nicht reservierte Charaktere :
A-Za-z0-9-_.~
quelle
Die bevorstehende Änderung gilt für chinesische, arabische Domainnamen und nicht für URIs. Die internationalisierten URIs werden als IRIs bezeichnet und sind in RFC 3987 definiert . Allerdings würde ich empfehlen, dies nicht selbst zu tun, sondern sich auf eine vorhandene, getestete Bibliothek zu verlassen, da es viele Möglichkeiten für die URI-Codierung / -Decodierung gibt und was nach Spezifikation als sicher angesehen wird, im Vergleich zu dem, was bei tatsächlicher Verwendung sicher ist (Browser). .
quelle
Wenn Sie den Benutzern eine besondere Erfahrung bieten möchten, können Sie
pushState
eine Vielzahl von Zeichen in die URL des Browsers einfügen:quelle