Ich habe eine ASP.NET MVC-Anwendung mit einer Route, mit der über / search / <searchterm> nach Dingen gesucht werden kann.
Wenn ich "search / abc" gebe, funktioniert es gut, aber wenn ich "/ search / a + b + c" (korrekt url-codiert) gebe, lehnt IIS7 die Anforderung mit dem HTTP-Fehler 404.11 ab ( Das Anforderungsfiltermodul ist so konfiguriert, dass a verweigert wird Anfrage, die eine doppelte Escape-Sequenz enthält ). Zuallererst, warum macht es das? Es scheint den Fehler nur dann auszulösen, wenn er Teil der URL ist, aber nicht als Teil einer Abfragezeichenfolge (/ Transmit? Q = a + b + c funktioniert einwandfrei).
Jetzt könnte ich doppelte Escape-Anforderungen im Sicherheitsbereich meiner web.config aktivieren, aber ich zögere, dies zu tun, da ich die Auswirkungen nicht verstehe und auch nicht, warum der Server die Anforderung "a + b + c" als ablehnen würde Teil der URL, aber als Teil einer Abfragezeichenfolge akzeptieren.
Kann jemand erklären und Ratschläge geben, was zu tun ist?
quelle
/search/a%2520b%2520c
im Markup , das zu einem schönen Fehler "Ein potenziell gefährlicher Request.Path-Wert wurde vom Client (%) erkannt" führte. Sie können anscheinend nicht gewinnen.Antworten:
Bearbeiten: Hervorhebung der relevanten Abschnitte.
Grundsätzlich gilt: IIS ist übermäßig paranoid. Sie können diese Prüfung sicher deaktivieren, wenn Sie mit den uri-decodierten Daten nichts besonders Unkluges tun (z. B. das Generieren lokaler Dateisystem-URIs über die Verkettung von Zeichenfolgen).
Um die Prüfung zu deaktivieren, gehen Sie wie folgt vor (von hier aus ): (siehe meinen Kommentar unten für die doppelte Flucht).
Wenn das Plus - Symbol ein gültiges Zeichen in einer Sucheingabe ist, werden Sie brauchen , damit „allowDoubleEscaping“ zu ermöglichen , solche Eingabe zu verarbeiten , die von dem Pfad der URI IIS.
Schließlich besteht eine sehr einfache, wenn auch begrenzte Problemumgehung darin, einfach '+' zu vermeiden und stattdessen '% 20' zu verwenden. In jedem Fall ist die Verwendung des Symbols '+' zum Codieren eines Leerzeichens keine gültige URL-Codierung , sondern spezifisch für einen begrenzten Satz von Protokollen und wird wahrscheinlich aus Gründen der Abwärtskompatibilität weitgehend unterstützt. Wenn auch nur zu Kanonisierungszwecken, ist es sowieso besser, Leerzeichen als '% 20' zu codieren. und dies umgeht das IIS7-Problem (das bei anderen Sequenzen wie% 25ab immer noch auftreten kann).
quelle
Ich möchte nur hinzufügen , einige Informationen zu Eamon Nerbonne Antwort auf den im Zusammenhang „ was zu tun ist “ Teil Ihrer Frage (nicht das Warum zu erklären).
Mit können Sie auch die Einstellungen einer bestimmten Anwendung problemlos ändern
Geben Sie Folgendes ein (von hier aus: http://blogs.iis.net/thomad/archive/2007/12/17/iis7-rejecting-urls-containing.aspx ):
(Sie können Ersatz zB
YOURSITENAME
mitDefault Web Site
für die Anwendung dieser Regel auf die Standard - Website)Ein Beispiel:
quelle
Haben Sie darüber nachgedacht, eine Such-URL wie "/ search / a / b / c" zu haben?
Sie müssten eine Route wie einrichten
Extrahieren Sie dann die Suchwerte aus Ihrer Pfadzeichenfolge in der Aktion.
HTHs
Charles
quelle
Ich bin unter IIS 7.5 auf einen Server.TransferRequest () in einer Anwendung gestoßen.
Das Codieren des Dateinamens verursachte das Double-Escape-Problem. Wenn ich es jedoch nicht codieren würde, würde der Fehler "potenziell gefährlich Request.Path" auftreten .
Das Problem wurde behoben, indem ein beliebiges Protokoll, auch ein leeres, in die URL eingefügt wurde, die ich an Server.TranferRequest () übergebe.
Funktioniert nicht:
Werke:
quelle