Ein potenziell gefährlicher Request.Path-Wert wurde vom Client erkannt (*).

218

Ich erhalte den eher selbsterklärenden Fehler:

Ein potenziell gefährlicher Request.Path-Wert wurde vom Client erkannt (*).

Das Problem ist auf *die Anforderungs-URL zurückzuführen:

https://stackoverflow.com/Search/test*/0/1/10/1

Diese URL wird verwendet, um eine Suchseite zu füllen, auf der 'test *' der Suchbegriff ist und der Rest der URL sich auf verschiedene andere Filter bezieht.

Gibt es eine einfache Möglichkeit, diese Sonderzeichen in der URL zuzulassen? Ich habe versucht, das zu ändern web.config, ohne Erfolg.

Soll ich die Sonderzeichen manuell codieren / decodieren? Oder gibt es dafür eine bewährte Methode? Ich möchte die Verwendung von Abfragezeichenfolgen vermeiden. - aber es kann eine Option sein.

Die Anwendung selbst ist eine c# asp.netWebforms-Anwendung, die Routing verwendet, um die oben genannte nette URL zu erstellen.

samdd
quelle
1
Hat Ihre Seite ValidateRequest=falseoben?
Neil Knight
Ich weiß nicht, aus welchem ​​Grund die Website intern eine Umleitung versucht hat, bei der eine URL wie ' localhost /: // localhost / myWebsiteName ' erstellt wurde, die mir denselben Fehler verursachte. Ich weiß nicht, warum die ASP.net-Pipeline dies als gefährliche Anforderungs-URL betrachtet.
RBT

Antworten:

97

Das *Zeichen ist im Pfad der URL nicht zulässig, es gibt jedoch kein Problem bei der Verwendung in der Abfragezeichenfolge:

http://localhost:3286/Search/?q=test*

Es handelt sich nicht um ein Codierungsproblem. Das *Zeichen hat in einer URL keine besondere Bedeutung. Es spielt also keine Rolle, ob Sie es per URL codieren oder nicht. Sie müssten es mit einem anderen Schema codieren und dann dekodieren.

Beispiel: Verwenden eines beliebigen Zeichens als Escapezeichen:

query = query.Replace("x", "xxx").Replace("y", "xxy").Replace("*", "xyy");

Und Dekodierung:

query = query.Replace("xyy", "*").Replace("xxy", "y").Replace("xxx", "x");
Guffa
quelle
15
Das Spiel "xxx" "xxy" "xyy" ist ziemlich clever. Vielleicht möchten Sie die Logik dahinter näher erläutern, um die Leser nicht zu verwirren.
SimpleVar
2
Die Anfrage war, es im PATHund nicht im Querystring zu verwenden.
Hugo Delsing
Ich bin auf dasselbe Szenario gestoßen, in dem einer meiner Parameter eine URL war. Selbst wenn die URL richtig codiert ist, würde ich diesen Fehler erhalten. Ich habe schließlich nur base64 den Parameter codiert (und in meiner API dekodiert), was viel einfacher war, als herauszufinden, was los war. Wahrscheinlich eine bessere Wahl als die Implementierung Ihrer eigenen Ersetzungsroutine.
SpokaneDJ
1
Können Sie aa<=> aund ab<=> nicht *als einfacheres Codierungsschema verwenden?
Wörter wie Jared
Im Moment hat mich das gerettet, danke, aber zu gegebener Zeit möchte ich diesen Rat überprüfen: stackoverflow.com/a/603962/1830909 und ich werde mich freuen , wenn ich Ihren Gedanken höre.
QMaster
316

Wenn Sie .NET 4.0 verwenden, sollten Sie diese URLs über die web.config zulassen können

<system.web>
    <httpRuntime 
            requestPathInvalidCharacters="&lt;,&gt;,%,&amp;,:,\,?" />
</system.web>

Hinweis: Ich habe gerade das Sternchen (*) entfernt. Die ursprüngliche Standardzeichenfolge lautet:

<httpRuntime 
          requestPathInvalidCharacters="&lt;,&gt;,*,%,&amp;,:,\,?" />

Weitere Informationen finden Sie in dieser Frage .

Dave Transom
quelle
5
Gibt es eine Möglichkeit, dies mithilfe eines MVC-Attributs für eine Aktion zu tun, damit ich dies nicht für die gesamte App deaktivieren muss? Ähnlich zu dieser Antwort hier: stackoverflow.com/a/1540976/298758
longda
4
@longda: Versuchen Sie vielleicht, es mit einem <location path = "my / path"> -Element für die URL zu verpacken, die Sie benötigen. Die Verwendung von Reflexion wäre aus globaler Sicht recht einfach, aber ich bin mir nicht sicher, ob ich sie pro Controller / Aktion festlegen soll. Vielleicht eine Frage stellen?
Dave Transom
Es funktioniert einfach nicht im ASP.net MVC-Projekt. Beim Empfang des Ausführungsprozesses zum Bestimmen des Layouts in viewStart wurde der folgende Fehler angezeigt: Unzulässiges Zeichen im Pfad.
QMaster
7

Für mich arbeite ich an .net 4.5.2 mit Web-API 2.0. Ich habe den gleichen Fehler. Ich habe ihn nur durch Hinzufügen von requestPathInvalidCharacters = "" in den requestPathInvalidCharacters festgelegt. Sie müssen nicht zulässige Zeichen festlegen. Andernfalls müssen Sie Zeichen entfernen, die dieses Problem verursachen.

<system.web>
     <httpRuntime targetFramework="4.5.2" requestPathInvalidCharacters="" />
     <pages  >
      <namespaces>
     ....
 </namespaces>
    </pages> 
  </system.web>

** Beachten Sie, dass dies keine gute Vorgehensweise ist. Möglicherweise handelt es sich um einen Beitrag mit diesem Parameter, da das Attribut eines Objekts besser ist, oder versuchen Sie, das Sonderzeichen zu codieren. - Nachdem ich nach Best Practices für das Entwerfen von Rest-APIs gesucht hatte, stellte ich fest, dass wir bei der Suche, Sortierung und Paginnierung den Abfrageparameter wie folgt behandeln müssen

/companies?search=Digital%26Mckinsey

und dies löst das Problem, wenn wir & in der URL um% 26 codieren und auf irgendeine Weise ersetzen. Auf dem Server erhalten wir den korrekten Parameter Digital & Mckinsey

Dieser Link kann bei bewährten Methoden zum Entwerfen von Rest-Web-APIs hilfreich sein. https://hackernoon.com/restful-api-designing-guidelines-the-best-practices-60e1d954e7c9

MNF
quelle
6

Sie sollten den Routenwert codieren und dann (falls erforderlich) den Wert dekodieren, bevor Sie suchen.

Tejs
quelle
Vielen Dank für Ihre Antwort. Meinen Sie damit, dass Sie Elemente wie * effektiv ersetzen und sie dann wieder ersetzen, wenn Sie sie lesen?
Können Sie ein Codebeispiel zum Codieren und Decodieren der Werte zeigen?
Ciaran Gallagher
1

Bei der Verwendung der URL hat ein Benutzer versehentlich ein / anstelle eines? um die Abfrageparameter zu starten

z.B:

url.com/endpoint/parameter=SomeValue&otherparameter=Another+value

was hätte sein sollen:

url.com/endpoint?parameter=SomeValue&otherparameter=Another+value

Trykyn
quelle
Ja, auch für mich url.com/endpoint¶meter=SomeValue&otherparameter=AnotherValue
Bhargav Konda
0

Diese Ausnahme trat in meiner Bewerbung auf und war eher irreführend.

Es wurde ausgelöst, als ich eine ASPX-Seiten-Webmethode mit einem Ajax-Methodenaufruf aufrief und ein JSON-Array-Objekt übergab. Die Signatur der Webseitenmethode enthielt ein Array eines stark typisierten .NET-Objekts, OrderDetails. Die Actual_Qty-Eigenschaft wurde als int definiert, und die Actual_Qty-Eigenschaft des JSON-Objekts enthielt "4" (zusätzliches Leerzeichen). Nach dem Entfernen des zusätzlichen Speicherplatzes wurde die Konvertierung ermöglicht, die Webseitenmethode wurde durch den Ajax-Aufruf erfolgreich erreicht.

Bertha
quelle
0

Versuchen Sie, den Server des Webprojekts als lokalen IIS festzulegen, wenn es sich um IIS Express handelt. Stellen Sie sicher, dass die Projekt-URL richtig ist, und erstellen Sie ein virales Verzeichnis.

Burk
quelle
0

Beim Umgang mit URLs (Uniform Resource Locator) gibt es bestimmte Syntaxstandards . In dieser speziellen Situation handelt es sich um reservierte Zeichen .

Wie bis RFC 3986 können reservierte Zeichen durch die generische Syntax, durch jede schemaspezifische Syntax oder durch die implementierungsspezifische Syntax des Dereferenzierungsalgorithmus eines URI als Begrenzer definiert werden (oder auch nicht). Und das Sternchen (*) ist ein reserviertes Zeichen.

Die beste Vorgehensweise ist die Verwendung nicht reservierter Zeichen in URLs zu verwenden, oder Sie können versuchen, sie zu codieren.

Grabe weiter:

Roshana Pitigala
quelle
1
Dieser Fehler tritt auch auf, wenn das reservierte Zeichen in der URL prozentual codiert ist, z. B. %25anstelle von %, sodass IIS diesen Fehler möglicherweise für eine perfekt gültige URL zurückgibt.
Florian Winter