ASP.Net die URL-Codierung
Ich bin Implementierung von URL-rewriting in ASP.net und meine URLs sind, was mir eine Welt von Problemen.
Die URL generiert aus einer Datenbank von Abteilungen & Kategorien. Ich möchte die Mitarbeiter in der Lage sein, um Elemente hinzuzufügen, um die Datenbank mit dem, was spezielle Zeichen, die geeignet sind, ohne es zu brechen der Website.
Ich bin der Codierung der Daten, bevor ich konstruiere die URLs.
Gibt es mehrere Probleme...
- IIS decodiert die URL, bevor es erreicht .net macht es unmöglich, richtig zu analysieren alles, was mit einem "/".
- ASP.net wird verwirrt durch die url machen "~" nutzlos innerhalb bestimmter Seiten
- Wanderte ich von der integrierten test-server auf meinem lokalen IIS-server (XP-Rechner) und jede URL, die mit einem codierten & (%26) gibt mir ein "Bad Request" - Fehler.
- UrlEncode lässt einige Bruch-Zeichen unberührt wie '.'
Ich habe noch zwei andere Veröffentlichungen zu diesem Thema, zu der Zeit sah ich nur die kleinen Probleme nicht das große problem upstream. Ich habe festgestellt, dass einige registry-tricks zu lösen, der "Bad Request" - Problem, aber ich werde die Bereitstellung auf einem shared-hosting-Umgebung zu machen, nutzlos. Ich weiß auch, dass dies ist ein fix für einige Sicherheits-Problem, also ich möchte nicht unbedingt umgehen, ohne zu wissen, was der Würmer, die ich bin-öffnung.
Anstatt zu versuchen zu zwingen .net, gib mir die raw-url, oder überschreiben Sie den IIS-Einstellungen, die ich möchte, um wirklich sichere URLs in den ersten Platz.
Werde ich beachten, ich habe versucht, AntiXss.URLEncode, HttpUtility.URLEncode, URI.EscapeDataString. Ich habe sogar versucht die dumme Sachen wie double URLEncodng. Gibt es ein Dienstprogramm, das macht, was ich brauche, oder muss ich wirklich die Rolle meiner eigenen. Ich bin auch in Erwägung ziehen etwas Hacky, wie das ersetzen der % mit einer ungewöhnlichen Zeichenfolge von Zeichen. Das Endergebnis sollte wenigstens lesbar, das war der Punkt, der Einsatz von URL-rewriting in den ersten Platz.
Sorry für den langen post - ich wollte nur sicherstellen, dass ich ' ve enthalten alle notwendigen details. Ich kann nicht scheinen, finden alle relevanten Informationen auf dieser, und es scheint, wie es wäre eine gemeinsame problem - also vielleicht bin ich etwas fehlt gross. Vielen Dank für Ihre Hilfe und Geduld, mit der Sie die lange Erklärung!
Bearbeiten für Klarheit:
Wenn ich sage, die urls sind gebaut aus einer Datenbank, was ich meine ist, dass die Verzeichnis-Struktur ist contstructed aus den Abteilungen und Kategorien in meiner Datenbank.
Einige Beispiel-URLS -
Mystore/Kälte/Bar+Kühlschrank.aspx
Mystore/Kochen+Geräte.aspx
Mystore/Küche/Schneiden+Boards.asxpx
Die Probleme kommen, wenn ich eine Abteilung wie "Getränke & Bar" oder "Konditor/Dekoration" zu konstruieren, meine URL. Trotz kodiert wird zuerst die Ursache der oben genannten Probleme.
Mein Handler sind bereits implementiert und funktioniert gut, außer für das Sonderzeichen-encoding-Probleme.
InformationsquelleAutor Kelly Gendron | 2009-08-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie überlegen, mit einer Tabelle aus Ihrer Kategorie/department-Tabelle, die eine einzigartige URL für jede Kategorie. Dann können Sie eine spezielle routine zum generieren der URLs. Dies kann eine SQL-Skalarfunktion oder eine CLR-Funktion, aber eines der Dinge, die er tun würde, normalisieren Sie die URL für das web. Sie können konvertieren "Beverage & Bar" bis "Getränke-Bar" und "Konditor /Dekoration" "Gebäck-Dekoration". Vor allem die routine braucht, um zu ersetzen Sie alle ungültigen HTTP-URL-Zeichen etwas anderes. Ein Beispiel ist dieses:
Könnten Sie machen dies zu einem SQL-enhance-Funktion, oder führen Sie die URL-Erzeugung in einem eigenen Prozess. Für die Umsetzung der Zuordnung weisen Sie die gesamte URL direkt auf eine Kategorie-ID. Dieser Ansatz ist auf lange Sicht besser aus mehreren Gründen. Erste, Sie sind nicht immer der URL-Generierung, tun Sie dies einmal und Sie bleiben statisch, Sie müssen nicht zu kümmern, Ihre Verfahren ändern, und dann den GoogleBot nicht in der Lage zu finden, die alten URLs. Auch, wenn Sie eine Kollision bemerken Sie möglicherweise eine potenzielle doppelte Kategorie-Namen, weil eine Kollision würde nur anders werden durch spezielle Zeichen. Schließlich können Sie immer sehen Sie Ihre URLs aus der Datenbank, ohne dass die mapping-Funktion.
InformationsquelleAutor eulerfx
Ich habe einen url-rewrite, die ich implementieren in den global.asax-Datei in der begin-authentifizierte Anfrage so habe ich eine gewisse Sicherheit. Dies ist, wo nehme ich die raw-url und dann die db schauen. dies dann schreibt den Pfad der aspx-Seite und alle Parameter, die übergeben werden durch den query-string. Keine Codierung erforderlich ist.
Jedoch wenn Sie verwenden die url, um tatsächlich die Daten zu verändern, dann kann ich sehen, dass Sie haben riesige Probleme, wie Sie effektiv mit der http-GET zum ändern der Datenbank. Es ist in der Regel concidered eine schlechte idead, und nicht etwas, das ich tun.
Ich nur benutzen Sie eine post-Anforderung zu tun, alle Datenbank-manipulation. Dies hält die url sauber ist, wie alle Daten in der Seite bilden.
Das einzige Problem, das ich hatte, war, um die richtige url zu der Seite.form.Maßnahmen, die in den meisten Fällen ist die Reine url.
Wenn Ihr die Kategorie-Namen, die das Problem verursachen, dann sollte man vielleicht einschränken, die Namen zu alpha-numerische Zeichen nur-und swap-Bereiche für "-". IIS werfen wird wackelig mit Punkten "." wie sieht es für die Datei-Namen.
P. S.
IIS nicht verstehen die tilde "~", das ist etwas, was der compiler versteht. also, wenn Sie es verwenden, in ein Anker-tag wird es nicht wie erwartet funktionieren, und sollten Sie den Stammordner der Anwendung anstelle der tilde.
Edit:
OK, es sieht aus wie ein Problem mit IIS-Probleme mit bestimmten Zeichen wie . /und &. Auch wenn Sie tun urlencode diese IIS wird immer noch versuchen, zu implementieren Ihre eigenen Bedeutungen.
Als solche betrachten, Sie zu entfernen, so:
Getränke & bar wird BeverageBar
Konditorei /Dekoration wird PastryDecorating.
Dies wird halten Sie die urls sauber, aber bedeutet eine zusätzliche Spalte in der Datenbank, so können Sie cheack die url gegen diese Verkürzung der Kategorie Namen.
Das könnte die beste Lösung sein. Ich kann gerade Massiv über-verkomplizieren. Meine einzige Sorge ist, dass ich bin gehen zu müssen, um in der Lage sein, um die lookup-Elemente aus der URL könnte erschwert werden durch eine nicht reversible Methode der Codierung. Meine einzige andere Idee war die Verwendung Uri.EscapeDataString(b).Replace ("%", "_"), die ich bin ziemlich sicher verurteilen würde, mich zu Programmierer die Hölle. Vielen Dank für deine schnelle Antworten und Hilfe.. ich bin dabei, einen anderen Blick auf meinen code, um zu sehen, ob dies funktionieren wird.
Ich danke Ihnen sehr für Ihre Hilfe. Dies ist eine jener Zeiten, wo ich bin zutiefst frustriert, dass ich nicht akzeptieren kann, dass mehrere Antworten. Sie wies mich in die richtige Richtung und hat mich wieder auf die Strecke mit diesem... Danke!!!!
InformationsquelleAutor Daisy Moon
Ich habe genau das gleiche problem. Vielen Dank für das schreiben es oben so schön. Es wirklich half mir zu verstehen, das problem besser.
Hatte ich einige andere überlegungen, jedoch. Eines der Ziele, die ich habe, ist zu unterstützen, das Potenzial für alle Zeichen in der url, die auf der Grundlage der überschrift eines Artikels. Zusätzlich möchte ich, um die Eindeutigkeit der Kodierung und ein zwei-Wege-encode /decode Prozess.
So habe ich einige manuelle Codierung, das problem zu lösen. Dies wird nicht vollständig zu eliminieren Prozent-Codierung, aber erheblich reduzieren und halten Sie Benutzer von der Generierung einer unzugänglichen url. Mein Prozess beginnt mit der
Server.URLEncode
Funktion. Aber dies beseitigt nicht die Probleme, die in der url. Weil IIS ist die Dekodierung der url und dann übergeben es an die Anwendung, die bestimmte Zeichen bricht es mit einem gefährlichen Wunsch Ausnahme. Diesen Zeichen gehören+, &, /, !, *, ., (
und)
. Also auf diese Zeichen und andere Zeichen, die ich machen möchte mehr lesbar, ich mache eine doppelte Verschlüsselung für eine brauchbare url. Codierung ist auch hart, da die begrenzte Anzahl der zulässigen Zeichen in einer url. Also vor der Codierung, die ich gemacht alle Buchstaben Hauptstadt und habe dann die Codierung mit Kleinbuchstaben. Dieses hält es aus, völlig decodable, aber das kann ich leicht tun eine übereinstimmung in der Datenbank oder im code, indem Sie den Wert möchte ich übereinstimmung werden groß.Gut, hier ist mein code. Feedback wäre sehr geschätzt. Oh ya, das ist in VB, aber die Dinge sollten bei der übertragung über C# einfach genug.
Gefunden viele Zitate, die machen urlscan verrückt. Dies wird helfen, es zu beheben. Replace("%e2%80%99", "rsquo"). Replace("%e2%80%98", "lsquo"). Replace("%e2%80%9d", "ldquo"). Replace("%e2%80%9c", "bdquo"). Replace("%e2%80%9A", "lsrquo"). Replace("%e2%80%9f", "ldrquo").
Haben Sie einen Blick auf web.config-Parameter wie
requestFiltering allowDoubleEscaping="true"
(stackoverflow.com/a/1453287/1178314) undhttpRuntime requestValidationMode="2.0" relaxedUrlToFileSystemMapping="true" requestPathInvalidCharacters=""
. In meinem Fall verwenden, es erlaubt mir, zu unterstützen viele weitere Zeichen in urls.InformationsquelleAutor Nate
Ich denke, Sie sind auf der Suche für
HttpUtility.UrlEncode
undHttpUtility.HtmlDecode
InformationsquelleAutor Toolkit