L'abilitazione del doppio escape è pericolosa?


136

Ho un'applicazione ASP.NET MVC con un percorso che consente di cercare cose tramite / search / <searchterm>.

Quando fornisco "search / abc" funziona bene, ma quando fornisco "/ search / a + b + c" (codifica URL corretta), IIS7 rifiuta la richiesta con errore HTTP 404.11 ( il modulo di filtro richieste è configurato per negare un richiesta che contiene una doppia sequenza di escape ). Innanzitutto, perché lo fa? Sembra generare l'errore solo se fa parte dell'URL, ma non come parte di una stringa di query (/ trasmetti? Q = a + b + c funziona correttamente).

Ora potrei abilitare le doppie richieste di escape nella sezione di sicurezza del mio web.config ma sono titubante nel farlo poiché non capisco le implicazioni, né perché il server rifiuta la richiesta "a + b + c" come parte dell'URL ma accetta come parte di una stringa di query.

Qualcuno può spiegare e dare qualche consiglio su cosa fare?


7
Ho anche provato l'opzione forse più corretta di chiamare Server.Url Path Encode e ho finito con /search/a%2520b%2520cil mark-up che ha portato a un delizioso errore "Un valore Request.Path potenzialmente pericoloso rilevato dal client (%)". Non puoi vincere, a quanto pare.
Zhaph - Ben Duguid,

Risposte:


158

Modifica: aggiunta enfasi alle sezioni pertinenti.

Fondamentalmente: IIS è eccessivamente paranoico. Puoi disabilitare questo controllo in sicurezza se non stai facendo qualcosa di particolarmente poco saggio con i dati decodificati uri (come la generazione di URI del filesystem locale tramite concatenazione di stringhe).

Per disabilitare il controllo, procedi come segue (da qui ): (vedi il mio commento qui sotto per ciò che comporta il doppio escape).

<system.webServer>
    <security>
        <requestFiltering allowDoubleEscaping="true"/>
    </security>
</system.webServer>

Se il simbolo più è un carattere valido in un input di ricerca, sarà necessario abilitare "allowDoubleEscaping" per consentire a IIS di elaborare tale input dal percorso dell'URI.

Infine, una soluzione molto semplice, seppur limitata, è semplicemente quella di evitare "+" e utilizzare invece "% 20". In ogni caso, l'utilizzo del simbolo "+" per codificare uno spazio non è una codifica URL valida , ma specifica per un set limitato di protocolli e probabilmente ampiamente supportata per motivi di compatibilità con le versioni precedenti. Se solo per scopi di canonicalizzazione, ti conviene codificare gli spazi come '% 20' comunque; e questo risolve bene il problema di IIS7 (che può ancora emergere per altre sequenze, come% 25ab.)


3
Disabiliterei il controllo. È una seccatura e non fornisce ulteriore sicurezza alla maggior parte delle app.
Eamon Nerbonne,

3
Hai un link / riferimento che è praticamente sicuro disabilitare il doppio escape? Inoltre, cosa impedisce esattamente questa misura di sicurezza?
Alex,

15
Se un uri ha un doppio escape, i componenti uri senza escape possono essi stessi contenere caratteri riservati e quindi (parti di) l'uri senza escape può essere esso stesso un uri valido. In breve, se si utilizza la stringa uri senza escape per costruire nuovi uri - in particolare i percorsi del file system - e non si riesce a sfuggire correttamente al nuovo percorso, è possibile consentire l'iniezione del percorso. L'iniezione di percorso potrebbe consentire a un utente malintenzionato di indurre il tuo programma a elaborare i dati che non dovrebbe, o a confonderlo nel pensare che due uri siano diversi quando sono effettivamente identici ma semplicemente codificati in modo diverso.
Eamon Nerbonne,


4
@Stijn: Sì: è sicuro . Tutto ciò che fa questo controllo è filtrare le richieste che potrebbero essere erroneamente interpretate dal codice errato (specialmente se si decodifica doppiamente o si costruisce Uri tramite string-concat e senza una codifica adeguata). Non stai eseguendo alcun tipo di elaborazione, quindi è praticamente sicuro da parte tua. Qualsiasi bug dovrebbe trovarsi nel file di base che serve il codice di IIS e penso che possiamo tranquillamente supporre che ormai sia stato testato molto, molto a fondo. Ancora una volta, questo controllo non è niente di speciale, si limita a salvare cose che potrebbero essere decodificate e quindi assomigliano a un uri codificato .
Eamon Nerbonne,

2

Vorrei solo aggiungere alcune informazioni alla risposta di Eamon Nerbonne relative alla parte " cosa fare " della tua domanda (non spiegando i perché).
Puoi facilmente modificare anche le impostazioni di una particolare applicazione con

  1. apertura della console con diritti di amministratore (Start - cmd - tasto destro, Esegui come amministratore)
  2. digitando quanto segue (tratto da qui: http://blogs.iis.net/thomad/archive/2007/12/17/iis7-rejecting-urls-contain.aspx ):

    %windir%\system32\inetsrv\appcmd set config "YOURSITENAME" -section:system.webServer/security/requestfiltering -allowDoubleEscaping:true

    (ad esempio è possibile sostituire YOURSITENAMEcon l' Default Web Siteapplicazione di questa regola al sito Web predefinito)

  3. Entra, pronto.

Un esempio:

  1. in primo luogo ho avuto lo stesso problema: Errore HTTP 404.11 - Il modulo di filtro richieste è configurato per rifiutare una richiesta che contiene una doppia sequenza di escape.
  2. Digitando il testo sopra menzionato: Drupal7-un'altra Soluzione all'errore HTTP 404.11 - Il modulo di filtro richieste è configurato per rifiutare una richiesta che contiene una doppia sequenza di escape.
  3. Ora funziona come previsto: Soluzione all'errore HTTP 404.11 - Il modulo di filtro richieste è configurato per rifiutare una richiesta che contiene una doppia sequenza di escape.

1

Hai pensato di avere l'URL di ricerca come '/ search / a / b / c'?

Dovresti impostare un percorso come

search/{*path}

Quindi estrarre i valori di ricerca dalla stringa del percorso nell'azione.

HTHs
Charles


Il problema è che altri caratteri con codifica URL (incluso '/' stesso) potrebbero far parte della ricerca.
Alex,

Non potresti codificare tutti i "/" che fanno effettivamente parte della ricerca in "% 2F"?
Charlino,

0

Mi sono imbattuto in questo in IIS 7.5 facendo un Server.TransferRequest () in un'applicazione.

La codifica del nome file ha causato il problema della doppia escape, ma se non lo codificassi, verrei nell'errore "potenzialmente pericoloso Request.Path" .

Mettere un protocollo qualsiasi, anche vuoto, sull'URL che passo a Server.TranferRequest () risolto il problema.

Non funziona:

context.Server.TransferRequest("/application_name/folder/bar%20bar.jpg");

Lavori:

context.Server.TransferRequest("://folder/bar%20bar.jpg");
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.