Ich verstehe, warum das passiert, aber ich brauche einen Workaround. Ich habe mir andere Fragen zu StackOverflow angeschaut, aber keine davon war hilfreich. Ich möchte die Eingabevalidierung nicht auf der gesamten Website deaktivieren, da dies definitiv gefährlich ist. Ich habe nur einen (zumindest für jetzt) Ort, wo ich die Validierung der Eingabe deaktivieren muss.
Ich habe die Aktionsmethode mit [ValidateInput (false)] -Attribut dekoriert, und ich codiere die Strings mit Html.Encode. Trotzdem bekomme ich den gleichen Fehler. Hier ist meine Ansicht:
%Vor%Wie Sie sehen können, gibt es keine Benutzereingabe. Aber einige der Kategoriennamen haben einige "gefährliche" Zeichen in ihnen ... Irgendwelche Lösungen?
Obwohl Darins Antwort durchaus durchführbar ist, würde ich nicht empfehlen, Scott Hanselmans Technik zu verwenden, all diese Validierung Schritt für Schritt abzuschaffen. Sie werden früher oder später in tiefe enden ...
Der zweite Vorschlag, IDs zusammen mit Dummy Strings (die für SEO und Leute gut sind) zu verwenden, ist ein Weg zu gehen, aber manchmal sind sie auch nicht machbar. Stellen Sie sich diese Anforderungs-URL vor:
%Vor%Obwohl wir diese IDs haben, auf die wir uns verlassen können, und auch menschliche / SEO-freundliche Kategoriennamen, ist dies definitiv nicht erwünscht. ID + Dummy-String ist möglich, wenn wir einen einzelnen Artikel darstellen müssen. In anderen Fällen ist es nicht. Und da Sie die Kategorie und Unterkategorie anzeigen müssen, ist dies ein Problem.
Was können Sie tun?
Zwei mögliche Lösungen:
Bereinigung von Kategorienamen mit nur gültigen Zeichen - dies ist zwar möglich, aber wenn diese nicht statisch sind und von privilegierten Benutzern bearbeitet werden können, haben Sie hier kein Glück, denn selbst wenn Sie sie jetzt bereinigt haben, jemand wird später etwas ungültiges eingeben
Bereinigen Sie Ihre Zeichenfolge unterwegs - Wenn Sie den Kategorienamen verwenden, bereinigen Sie ihn und wenn Sie ihn lesen und verwenden (um die tatsächliche Kategorie-ID zu erhalten), können Sie den bereitgestellten (zuvor bereinigten) Kategorienamen mit dem Wert in der DB vergleichen Aufräumen im laufenden Betrieb entweder:
Ich würde vorschlagen, dass Sie den 2.2-Ansatz verwenden. Erweitern Sie Ihre DB-Tabelle um zwei Spalten:
Sie können auch eine eindeutige Einschränkung für die zweite Spalte festlegen. Es wird also nicht vorkommen, dass zwei Ihrer Kategorien (obwohl sie unterschiedliche Anzeigenamen aufweisen) dieselben URL-freundlichen Namen haben.
Das erste, was einem einfällt, ist, ungültige Zeichen zu entfernen, aber das ist sehr mühsam und du wirst höchstwahrscheinlich etwas auslassen. Es ist viel einfacher und klüger, gültige Zeichen aus dem Anzeigenamen Ihrer Kategorie zu erhalten. Ich habe das gleiche getan, wenn ich dummy URL-Kategorienamen erstellt habe. Nehmen Sie einfach heraus, was gültig ist und den Rest ausgibt. Es funktioniert normalerweise gut. Zwei Beispiele für solche regulären Ausdrücke:
(\w{2,})
- verwende nur Buchstaben, Ziffern und Unterstriche und mindestens zwei davon (also lassen wir a oder einzelne Zahlen und ähnliches weg, die keine Bedeutung hinzufügen und unsere URL unnötigerweise verlängern ([a-zA-Z0-9]{2,})
- nur Buchstaben und Ziffern (auch 2 +) Holen Sie sich alle Übereinstimmungen in Ihrem Anzeigenamen der Kategorie und verbinden Sie sie mit einem Leerzeichen / einem Bindestrich und speichern Sie sie zusammen mit dem ursprünglichen Anzeigenamen. Eine andere Frage von mir war genau das.
Warum eine zusätzliche Spalte? Weil Sie keinen regulären Ausdruck im SQL-Server ausführen können. Wenn Sie MySql verwenden, können Sie eine Spalte verwenden und einen regulären Ausdruck für die DB verwenden.
Auch wenn Sie es nicht so machen sollten ... manchmal gibt es keinen einfachen Weg, um es zu umgehen. requestPathInvalidCharacters auf dem httpRuntime-Tag in web.Config ist, was Sie suchen. Geben Sie Folgendes in das & lt; system.web & gt; Abschnitt:
<httpRuntime requestPathInvalidCharacters="<,>,*,%,:,\" />
Ich würde sehr empfehlen, dies zu sperren, indem Sie stattdessen Folgendes verwenden:
%Vor%Werfen Sie das einfach in den root & lt; configuration & gt; Etikett. Auf diese Weise ... öffnest du nicht deine gesamte Website, um ein kaufmännisches Und-Zeichen auf dem Pfad zuzulassen ... und potenziell die gesamte Website einem unvorhergesehenen Angriff auszusetzen.
Sie finden den folgenden Blog-Beitrag hilfreich bei der Verwendung von Sonderzeichen in URLs. Aber im Allgemeinen ist es am besten ersetzen Sie diese Titel mit Slugs genauso wie StackOverflow mit Fragetiteln in der URL für bessere SEO und verwenden Sie IDs, um sie zu identifizieren.
Tags und Links asp.net-mvc-3 razor security validation