2011-10-12 29 views
66

Sulla mia applicazione ASP.NET MVC, sto cercando di implementare un URL come di seguito:doppia sequenza di escape all'interno di un'URL: Il modulo di richiesta di filtraggio è configurato per rifiutare una richiesta che contiene una doppia fuga sequenza

/prodotto/tag/per + le famiglie

Quando provo a fare funzionare la mia applicazione con configurazioni di default, sto ottenendo questo messaggio con il codice di risposta 404,11:

Errore HTTP 404.11 - Non trovato

Il modulo di filtro richieste è configurato per negare una richiesta che contenga una sequenza di escape doppia.

posso andare in giro con questo errore implementando il codice di seguito all'interno del mio web.config:

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

Così, ora non sto ottenendo alcun 404.11.

Quello che mi chiedo è che tipo di buchi di sicurezza sto aprendo con questa implementazione.

BTW, la mia domanda è sotto .Net Framework 4.0 e in esecuzione sotto IIS 7.5.

+0

È possibile raggiungere la risorsa desiderata utilizzando invece '/ product/tags/for% 20families'? Quindi hai una soluzione alternativa per gli ID che contengono spazi. O sono completamente fuori di qui? –

+0

@atornblad un po 'fuori credo. La mia domanda: ** Quello che mi chiedo è che tipo di buchi di sicurezza che sto aprendo con questa implementazione. ** – tugberk

+4

IIS sta lanciando il carattere "+", che è [comportamento predefinito di Microsoft]. (Http: // blogs .iis.net/thomad/IIS7-rigetto-URL-contenenti) –

risposta

46

Le falle di sicurezza che si potrebbero aprire hanno a che fare con l'iniezione di codice - iniezione HTML, iniezione JavaScript o SQL injection.

Le impostazioni predefinite proteggono dagli attacchi in modo semi-efficiente, impedendo il funzionamento delle strategie di iniezione comuni. Più sicurezza di sicurezza rimuovi, più devi pensare a ciò che fai con l'input fornito tramite URL, richieste di query querys, dati di richieste POST, intestazioni HTTP e così via ...

Per esempio, se sei la costruzione di query SQL dinamiche in base al parametro id del vostro metodo di azione, in questo modo:

public ActionResult Tags(string id) 
{ 
    var sql = "SELECT * FROM Tags Where tagName = '" + id + "'"; 
    // DO STUFF... 
} 

(... che è NON una buona idea), la protezione predefinita, messo in atto da parte del framework .NET , potrebbe interrompere alcuni degli scenari più pericolosi, come l'utente che richiede questo URL:

/product/tags/1%27;drop%20table%20Tags;%20-- 

L'idea è quella di trattare ogni parte di url e altri input per i metodi di azione come possibili minacce. L'impostazione di sicurezza predefinita fornisce una certa protezione per te. Ogni impostazione di sicurezza predefinita che si modifica si apre per un po 'più di cattiveria potenziale che è necessario gestire manualmente.

Naturalmente presumo che non si stiano creando query SQL in questo modo. Ma le cose più subdole arrivano quando si memorizzano gli input dell'utente nel proprio database, quindi in seguito vengono visualizzati. L'utente malevolo potrebbe archiviare JavaScript o HTML nel tuo database che non sono codificati, il che a sua volta potrebbe minacciare altri utenti del tuo sistema.

Problemi correlati