È stato rilevato un valore Request.Path potenzialmente pericoloso dal client (*)


218

Ricevo l'errore piuttosto autoesplicativo:

Un valore Request.Path potenzialmente pericoloso è stato rilevato dal client (*).

Il problema è dovuto *all'URL della richiesta:

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

Questo URL viene utilizzato per popolare una pagina di ricerca in cui "test *" è il termine di ricerca e il resto dell'URL si riferisce a vari altri filtri.

C'è un modo semplice per consentire questi caratteri speciali nell'URL? Ho provato a modificare il web.config, inutilmente.

Devo codificare / decodificare manualmente i caratteri speciali? O c'è una buona pratica per fare questo, vorrei evitare di usare stringhe di query. - ma potrebbe essere un'opzione.

L'applicazione stessa è c# asp.netun'applicazione di moduli web che utilizza il routing per produrre il simpatico URL sopra.


1
La tua pagina ha ValidateRequest=falsein alto?
Neil Knight,

Non so per quale motivo il sito web stesse tentando internamente un reindirizzamento che stava creando un URL come ' localhost /: // localhost / myWebsiteName ' che mi stava dando lo stesso errore. Non so perché la pipeline ASP.net lo consideri un URL di richiesta pericoloso.
RBT,

Risposte:


97

Il *carattere non è consentito nel percorso dell'URL, ma non vi sono problemi nell'utilizzarlo nella stringa di query:

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

Non è un problema di codifica, il *personaggio non ha un significato speciale in un URL, quindi non importa se l'URL lo codifica o meno. Dovresti codificarlo utilizzando uno schema diverso, quindi decodificarlo.

Ad esempio, usando un carattere arbitrario come carattere di escape:

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

E decodifica:

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

15
Il gioco "xxx" "xxy" "xyy" è piuttosto intelligente. Potresti voler approfondire la logica che sta dietro per non confondere i lettori.
SimpleVar,

2
La richiesta era di usarlo nella PATHe non nella querystring.
Hugo Delsing,

Mi sono imbattuto nello stesso scenario in cui uno dei miei parametri era un URL. Anche se codificato correttamente con URL, otterrei questo errore. Alla fine ho semplicemente codificato il parametro base64 (e decodificato nel mio API) che era molto più facile che cercare di capire cosa stesse succedendo. Probabilmente una scelta migliore rispetto all'implementazione della propria routine di sostituzione.
SpokaneDJ,

1
Non puoi usare aa<=> ae ab<=> *come schema di codifica più semplice?
Words Like Jared,

Per ora questo mi ha salvato, grazie, ma al momento giusto voglio controllare questo consiglio: stackoverflow.com/a/603962/1830909 e sarò felice se sentirò il tuo pensiero.
QMaster

316

Se stai usando .NET 4.0 dovresti essere in grado di consentire questi URL tramite web.config

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

Nota, ho appena rimosso l'asterisco (*), la stringa predefinita originale è:

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

Vedi questa domanda per maggiori dettagli.


5
Un modo per farlo usando un attributo mvc su un'azione, quindi non devo disattivarlo per l'intera app? Simile a questa risposta qui: stackoverflow.com/a/1540976/298758
Longda

4
@longda: forse prova a racchiuderlo con un elemento <location path = "my / path"> per l'URL di cui hai bisogno. L'uso della riflessione sarebbe ragionevolmente semplice da una prospettiva globale, ma non sono sicuro di impostarlo su una base per controller / azione. Forse fai una domanda?
Dave Transom,

Semplicemente non funziona sul progetto ASP.net MVC, sta ricevendo il processo di esecuzione per determinare il layout in vista. L'avvio ha ottenuto questo errore: carattere illegale nel percorso.
QMaster

7

Per me, sto lavorando su .net 4.5.2 con Web API 2.0, ho lo stesso errore, l'ho impostato semplicemente aggiungendo requestPathInvalidCharacters = "" in requestPathInvalidCharacters devi impostare caratteri non consentiti altrimenti devi rimuovere caratteri che causare questo problema.

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

** Si noti che non è una buona pratica, potrebbe essere un post con questo parametro poiché l'attributo di un oggetto è migliore o provare a codificare il carattere speciale. - Dopo aver cercato le migliori pratiche per la progettazione di API di riposo, ho scoperto che nella ricerca, nell'ordinamento e nella paginazione, dobbiamo gestire il parametro di query in questo modo

/companies?search=Digital%26Mckinsey

e questo risolve il problema quando lo codifichiamo e lo sostituiamo nell'URL di% 26 in ogni caso, sul server riceviamo il parametro corretto Digital & Mckinsey

questo link può essere d'aiuto nella migliore pratica di progettazione di api web di riposo https://hackernoon.com/restful-api-designing-guidelines-the-best-practices-60e1d954e7c9


6

È necessario codificare il valore del percorso e quindi (se necessario) decodificare il valore prima di effettuare la ricerca.


Grazie per la risposta. Intendi effettivamente effettuare una sostituzione su elementi come * e poi sostituirli quando lo stai leggendo?

Puoi mostrare un esempio di codice di codifica e decodifica dei valori?
Ciaran Gallagher,

1

Per me, durante la digitazione dell'URL, un utente ha utilizzato accidentalmente un / anziché un? per avviare i parametri della query

per esempio:

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

che avrebbe dovuto essere:

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


Sì, lo stesso per me url.com/endpoint¶meter=SomeValue&otherparameter=AnotherValue
Bhargav Konda

0

Questa eccezione si è verificata nella mia domanda ed era piuttosto fuorviante.

È stato generato quando stavo chiamando un metodo Web della pagina aspx utilizzando una chiamata al metodo ajax, passando un oggetto array JSON. La firma del metodo della pagina Web conteneva una matrice di un oggetto .NET fortemente tipizzato, OrderDetails. La proprietà Actual_Qty è stata definita come int e la proprietà Actual_Qty dell'oggetto JSON conteneva "4" (carattere spazio extra). Dopo aver rimosso lo spazio aggiuntivo, la conversione è stata resa possibile, il metodo Pagina Web è stato raggiunto correttamente dalla chiamata ajax.


0

Prova a impostare correttamente il server del progetto Web come IIS locale se è IIS Express. Assicurati che l'URL del progetto sia corretto e crea una directory viruale.


0

Nel trattare con Uniform Resource Locator (URL) ci sono alcuni standard di sintassi , in questa situazione particolare abbiamo a che fare con Personaggi riservati .

Fino a RFC 3986 , i caratteri riservati possono (o non possono) essere definiti come delimitatori dalla sintassi generica, da ciascuna sintassi specifica dello schema o dalla sintassi specifica dell'implementazione dell'algoritmo di dereferenziazione di un URI; E l'asterisco (*) è un carattere riservato.

La migliore pratica è usare Personaggi senza prenotazione negli URL oppure puoi provare a codificarli.

Continua a scavare :


1
Questo errore si verifica anche se il carattere riservato nell'URL è codificato in percentuale, ad es. %25Invece di %, quindi IIS può restituire questo errore per un URL perfettamente valido.
Florian Winter,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.