Ich habe eine Anwendung, die eine POST-Anfrage an die VB-Forensoftware sendet und jemanden anmeldet (ohne Cookies oder ähnliches zu setzen).
Sobald der Benutzer angemeldet ist, erstelle ich eine Variable, die einen Pfad auf seinem lokalen Computer erstellt.
c: \ tempfolder \ date \ username
Das Problem ist, dass einige Benutzernamen die Ausnahme "Illegale Zeichen" auslösen. Wenn mein Benutzername beispielsweise wäre mas|fenix
, würde dies eine Ausnahme auslösen.
Path.Combine( _
Environment.GetFolderPath(System.Environment.SpecialFolder.CommonApplicationData), _
DateTime.Now.ToString("ddMMyyhhmm") + "-" + form1.username)
Ich möchte es nicht aus der Zeichenfolge entfernen, aber ein Ordner mit ihrem Benutzernamen wird über FTP auf einem Server erstellt. Und das führt zu meiner zweiten Frage. Kann ich beim Erstellen eines Ordners auf dem Server die "unzulässigen Zeichen" belassen? Ich frage dies nur, weil der Server auf Linux basiert und ich nicht sicher bin, ob Linux dies akzeptiert oder nicht.
BEARBEITEN: Es scheint, dass die URL-Codierung NICHT das ist, was ich will. Folgendes möchte ich tun:
old username = mas|fenix
new username = mas%xxfenix
Wobei% xx der ASCII-Wert oder ein anderer Wert ist, der das Zeichen leicht identifizieren würde.
Antworten:
Bearbeiten: Beachten Sie, dass diese Antwort jetzt veraltet ist. Siehe Siarhei Kuchuks Antwort unten für eine bessere Lösung
UrlEncoding macht das, was Sie hier vorschlagen. Mit C # verwenden Sie einfach
HttpUtility
, wie erwähnt.Sie können die unzulässigen Zeichen auch neu formulieren und dann ersetzen. Dies wird jedoch weitaus komplexer, da Sie eine Art Zustandsmaschine (z. B. Schalter ... Fall) benötigen, um sie durch die richtigen Zeichen zu ersetzen. Da
UrlEncode
dies im Vorfeld geschieht, ist es ziemlich einfach.Was Linux im Vergleich zu Windows betrifft, gibt es einige Zeichen, die unter Linux akzeptabel sind und nicht unter Windows, aber ich würde mir darüber keine Sorgen machen, da der Ordnername durch Dekodieren der URL-Zeichenfolge mit zurückgegeben werden kann
UrlDecode
, sodass Sie die Zeichenfolge umgehen können Änderungen.quelle
A potentially dangerous Request.Path value was detected from the client
.Ich habe mit den verschiedenen Methoden experimentiert, die .NET für die URL-Codierung bereitstellt. Vielleicht ist die folgende Tabelle nützlich (als Ausgabe einer von mir geschriebenen Test-App):
Die Spalten stellen Codierungen wie folgt dar:
UrlEncoded:
HttpUtility.UrlEncode
UrlEncodedUnicode:
HttpUtility.UrlEncodeUnicode
UrlPathEncoded:
HttpUtility.UrlPathEncode
EscapedDataString:
Uri.EscapeDataString
EscapedUriString:
Uri.EscapeUriString
HtmlEncoded:
HttpUtility.HtmlEncode
HtmlAttributeEncoded:
HttpUtility.HtmlAttributeEncode
HexEscaped:
Uri.HexEscape
ANMERKUNGEN:
HexEscape
kann nur die ersten 255 Zeichen verarbeiten. Daher wird eineArgumentOutOfRange
Ausnahme für die lateinischen A-Extended-Zeichen (z. B. Ā) ausgelöst.Diese Tabelle wurde in .NET 4.0 generiert (siehe Levi Botelhos Kommentar unten, der besagt, dass die Codierung in .NET 4.5 etwas anders ist).
BEARBEITEN:
Ich habe eine zweite Tabelle mit den Codierungen für .NET 4.5 hinzugefügt. Siehe diese Antwort: https://stackoverflow.com/a/21771206/216440
EDIT 2:
Da die Leute diese Tabellen zu schätzen scheinen, dachte ich, dass Ihnen der Quellcode, der die Tabelle generiert, gefallen könnte, damit Sie selbst herumspielen können. Es ist eine einfache C # -Konsolenanwendung, die entweder auf .NET 4.0 oder 4.5 abzielen kann:
quelle
Uri.EscapeUriString
, aber Vorsicht, es unterstützt keinnull
Argument.UrlPathEncode
. Also im Grunde ersetzenUrlPathEncode
mitUri.EscapeUriString
.Sie sollten nur den Benutzernamen oder einen anderen Teil der URL codieren, der möglicherweise ungültig ist. Das Codieren einer URL durch URL kann zu Problemen führen, da Folgendes der Fall ist:
Wird nachgeben
Dies wird offensichtlich nicht gut funktionieren. Stattdessen sollten Sie NUR den Wert des Schlüssel / Wert-Paares in der Abfragezeichenfolge wie folgt codieren:
Hoffentlich hilft das. Wie bereits erwähnt, müssen Sie außerdem sicherstellen, dass unzulässige Dateinamenzeichen entfernt werden, da sonst das Dateisystem den Pfad nicht mag.
quelle
?
(da davon ausgegangen wird, dass die Abfragezeichenfolge bereits codiert ist). In Dan Herberts Beispiel sieht es so aus, als wäre erExample
der Text, der codiert werden muss, alsoHttpUtility.UrlPathEncode("http://www.google.com/search?q=Example");
nicht funktioniert. Versuchen Sie es mit?q=Ex&ple
(wo das gewünschte Ergebnis ist?q=Ex%26ple
). Es wird nicht funktionieren, weil (1) UrlPathEncode danach nichts mehr berührt?
und (2) UrlPathEncode&
sowieso nicht codiert .&
, da Sie dies benötigen, um Ihre Abfragezeichenfolgenparameter abzugrenzen. Es gibt jedoch Zeiten, in denen Sie auch codierte kaufmännische Und-Zeichen wünschen.Besser ist es zu benutzen
Uri.EscapeUriString
nicht auf das vollständige Profil von .net verweisen 4.
quelle
Uri.EscapeDataString
NICHTUri.EscapeUriString
Lesen Sie diesen Kommentar, er hat mir geholfen.Seit .NET Framework 4.5 und .NET Standard 1.0 sollten Sie verwenden
WebUtility.UrlEncode
. Vorteile gegenüber Alternativen:Es ist Teil von .NET Framework 4.5+, .NET Core 1.0+, .NET Standard 1.0+, UWP 10.0+ und allen Xamarin-Plattformen.
HttpUtility
Während es früher in .NET Framework verfügbar war (.NET Framework 1.1+), wird es viel später auf anderen Plattformen verfügbar (.NET Core 2.0+, .NET Standard 2.0+) und ist in UWP immer noch nicht verfügbar (siehe verwandte Frage ).In .NET Framework befindet es sich in
System.dll
, sodass im Gegensatz zu .NET Framework keine zusätzlichen Referenzen erforderlich sindHttpUtility
.Im Gegensatz zu URLs werden Zeichen für URLs ordnungsgemäß ausgeblendet
Uri.EscapeUriString
(siehe Kommentare zur Antwort von drweb86 ).Im Gegensatz zu (siehe verwandte Frage ) gibt es keine Begrenzung für die Länge der Zeichenfolge , sodass sie beispielsweise für POST-Anforderungen verwendet werden kann.
Uri.EscapeDataString
quelle
Levi Botelho bemerkte, dass die zuvor generierte Codierungstabelle für .NET 4.5 nicht mehr korrekt ist, da sich die Codierungen zwischen .NET 4.0 und 4.5 geringfügig geändert haben. Also habe ich die Tabelle für .NET 4.5 neu generiert:
Die Spalten stellen Codierungen wie folgt dar:
HttpUtility.UrlEncode
HttpUtility.UrlEncodeUnicode
HttpUtility.UrlPathEncode
WebUtility.UrlEncode
Uri.EscapeDataString
Uri.EscapeUriString
HttpUtility.HtmlEncode
HttpUtility.HtmlAttributeEncode
WebUtility.HtmlEncode
Uri.HexEscape
ANMERKUNGEN:
HexEscape kann nur die ersten 255 Zeichen verarbeiten. Daher wird eine ArgumentOutOfRange-Ausnahme für die lateinischen A-Extended-Zeichen (z. B. Ā) ausgelöst.
Diese Tabelle wurde in .NET 4.5 generiert (siehe Antwort https://stackoverflow.com/a/11236038/216440 für die für .NET 4.0 und darunter relevanten Codierungen).
BEARBEITEN:
quelle
(Net4.0) ? %3f................................
(Net4.5) ? %3f ..................................
Die URL-Codierung ist in .NET einfach. Verwenden:
Wenn dies dekodiert wird, um den Ordnernamen zu erhalten, müssen Sie weiterhin Zeichen ausschließen, die nicht in Ordnernamen verwendet werden können (*,?, / Usw.).
quelle
Wenn Sie System.Web nicht sehen können, ändern Sie Ihre Projekteinstellungen. Das Zielframework sollte ".NET Framework 4" anstelle von ".NET Framework 4-Clientprofil" sein.
quelle
Die .NET-Implementierung von
UrlEncode
entspricht nicht RFC 3986.Einige Zeichen sind nicht codiert, sollten es aber sein. Die
!()*
Zeichen werden in Abschnitt 2.2 des RFC als reservierte Zeichen aufgeführt, die codiert werden müssen, aber .NET kann diese Zeichen nicht codieren.Einige Zeichen sind codiert, sollten es aber nicht sein. Die
.-_
Zeichen werden in Abschnitt 2.2 des RFC nicht als reserviertes Zeichen aufgeführt, das noch nicht codiert werden sollte. .NET codiert diese Zeichen fälschlicherweise.Der RFC gibt an, dass Implementierungen aus Gründen der Konsistenz HEXDIG in Großbuchstaben verwenden sollten, wobei .NET HEXDIG in Kleinbuchstaben erzeugt.
quelle
Ich denke, die Leute hier wurden von der UrlEncode-Nachricht abgelenkt. URLEncoding ist nicht das, was Sie wollen - Sie möchten Dinge codieren, die auf dem Zielsystem nicht als Dateiname funktionieren.
Angenommen, Sie möchten eine gewisse Allgemeinheit - Sie können die illegalen Zeichen auf mehreren Systemen (MacOS, Windows, Linux und Unix) finden und sie zu einer Reihe von Zeichen zusammenfassen, um zu entkommen.
Für die Flucht sollte ein HexEscape in Ordnung sein (Ersetzen der Zeichen durch% XX). Konvertieren Sie jedes Zeichen in UTF-8-Bytes und codieren Sie alles> 128, wenn Sie Systeme unterstützen möchten, die keinen Unicode ausführen. Es gibt aber auch andere Möglichkeiten, z. B. die Verwendung von Schrägstrichen "\" oder HTML-Codierung "". Sie können Ihre eigenen erstellen. Alles, was ein System tun muss, ist, das nicht kompatible Zeichen zu "codieren". Mit den oben genannten Systemen können Sie das neu erstellen ursprünglicher Name - aber so etwas wie das Ersetzen der schlechten Zeichen durch Leerzeichen funktioniert auch.
Auf der gleichen Tangente wie oben ist die einzige, die verwendet werden kann
- Es codiert alles, was für OAuth benötigt wird, es codiert nicht die Dinge, die OAuth das Codieren verbietet, und codiert den Speicherplatz als% 20 und nicht als + (auch in der OATH-Spezifikation). Siehe: RFC 3986. AFAIK, dies ist das neueste URI-Spezifikation.
quelle
Ich habe eine C # -Methode geschrieben, die ALLE Symbole url-codiert:
quelle
Idealerweise gehören diese zu einer Klasse namens "FileNaming" oder benennen Encode einfach in "FileNameEncode" um. Hinweis: Diese sind nicht für die Verarbeitung vollständiger Pfade ausgelegt, sondern nur für die Ordner- und / oder Dateinamen. Idealerweise würden Sie zuerst Ihren vollständigen Pfad teilen ("/") und dann die Teile überprüfen. Und natürlich könnten Sie anstelle einer Vereinigung einfach das Zeichen "%" zur Liste der Zeichen hinzufügen, die in Windows nicht zulässig sind, aber ich denke, dass dies auf diese Weise hilfreicher / lesbarer / sachlicher ist. Decode () ist genau das gleiche, wechselt jedoch das Ersetzen (Uri.HexEscape (s [0]), s) mit dem Zeichen "maskiert".
Danke @ simon-tewsi für die sehr nützliche Tabelle oben!
quelle
Path.GetInvalidFileNameChars()
Zusätzlich zu der Antwort von @Dan Herbert sollten Sie nur die Werte allgemein codieren.
Split hat den Parameter Parameter Split ('&', '='); Ausdruck wird zuerst durch & dann '=' geteilt, so dass ungerade Elemente alle zu codierenden Werte sind (siehe unten).
quelle