2012-07-06 9 views
5

Simile a this question ma non mi interessa molto di quali caratteri non causerà/non provocherà l'errore. Sono più curioso di sapere quale metodo posso chiamare, per verificare da solo, se la stringa corrente genererà il messaggio di errore sopra riportato.Come verificare se la stringa si attiva "È stato rilevato un valore Request.Form potenzialmente pericoloso ..." errore

Per dare un po 'di background, sto creando password casuali quando un utente dimentica le loro e ha bisogno di un reset. Sfortunatamente, il generatore di password casuale "accidentalmente" ne ha creato uno con lo &# di recente. Ciò ha causato l'interruzione della pagina quando l'utente ha provato ad accedere con esso.

Come accennato in un sacco di posti intorno a questo argomento, ValidateRequest=false (o <httpRuntime requestValidationMode="2.0" /> per NET 4.0) può essere utilizzato per disattivare .NET verifica di questi exploit, ma non vedo alcun motivo per perdere questo ulteriore livello di sicurezza quando sono io a creare la stringa in primo luogo. E semplicemente dire al generatore casuale di ri-randomizzare su un elenco incompleto (<, &#, ecc.) Non sembra la soluzione più pulita, quindi mi piacerebbe utilizzare lo stesso metodo di controllo utilizzato da .NET.

Microsoft spiega quali exploit sono in questione e cosa viene fatto per proteggersi da loro here.

This guy parla di trovare una funzione denominata IsDangerousString dopo aver scavato con Reflector, ma non sono in grado di trovare questa funzione per usarlo. Inoltre si riferisce a .NET 1.1 e sto lavorando con .NET 3.5

+0

Domanda interessante, ma non vedo un motivo per cui si dovrebbe includere tali personaggi oscuri. Probabilmente userò la classe RandomNumberGenerator per riempire un byte [] e quindi usare un codificatore z-base32 per codificare i byte in una stringa. – Shelakel

+2

si conosce il carattere "exploit" che si desidera consentire perché non Html li codifichi prima della pubblicazione e poi li decodifichi HTML back – HatSoft

+0

@Shelakel Certo, ci sono molti altri modi per generare password casuali. Purtroppo, tuttavia, siamo bloccati a dover soddisfare tutte le 4 regole dei 4 caratteri (lettere minuscole, maiuscole, numeri, caratteri speciali) con password per questo progetto. Ovviamente, potrei semplicemente rimuovere i caratteri "oscuri" che offendono, ma dal momento che le specifiche non sono molto chiare mi piacerebbe usare la stessa funzione che il sistema deve controllare. – Mercurybullet

risposta

5

La classe ASP.NET che convalida le richieste è System.Web.CrossSiteScriptingValidation e il metodo desiderato è IsDangerousString. Sfortunatamente, entrambi sono contrassegnati con internal, quindi non puoi accedervi direttamente. Sono disponibili diverse opzioni:

Opzione 1: Chiama IsDangerousString tramite Reflection. Tuttavia, Microsoft potrebbe cambiare il metodo in qualsiasi momento, il che interromperà l'applicazione.

Opzione 2: Decompilare IsDangerousString e copiarlo sulla propria applicazione. Guarda il codice qui sotto.

Opzione 3: Chiama Membership.GeneratePassword. Questo restituisce una password che è garantita per passare la convalida della richiesta.

Estratti dalla classe ASP.NET CrossSiteScriptingValidation (tramite .NET Reflector):

private static char[] startingChars = new char[] { '<', '&' }; 

internal static bool IsDangerousString(string s, out int matchIndex) 
{ 
    matchIndex = 0; 
    int startIndex = 0; 
    while (true) 
    { 
     int num2 = s.IndexOfAny(startingChars, startIndex); 
     if (num2 < 0) 
     { 
      return false; 
     } 
     if (num2 == (s.Length - 1)) 
     { 
      return false; 
     } 
     matchIndex = num2; 
     char ch = s[num2]; 
     if (ch != '&') 
     { 
      if ((ch == '<') && ((IsAtoZ(s[num2 + 1]) || (s[num2 + 1] == '!')) || ((s[num2 + 1] == '/') || (s[num2 + 1] == '?')))) 
      { 
       return true; 
      } 
     } 
     else if (s[num2 + 1] == '#') 
     { 
      return true; 
     } 
     startIndex = num2 + 1; 
    } 
} 

private static bool IsAtoZ(char c) 
{ 
    return (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z'))); 
} 
+3

Grazie per le informazioni.Poiché la funzione è interna e non potrò accedervi direttamente per gli aggiornamenti, c'è qualche ragione per non usare semplicemente la regex seguente (con ignoreCase)? '\ <[a-z! /?] | & #' – Mercurybullet

+0

La regex è equivalente all'opzione 2, solo molto più concisa. :-) Questo è probabilmente il meglio che puoi fare per ora. Nella prossima versione di ASP.NET, tuttavia, sarà possibile saltare la convalida per determinati campi utilizzando [HttpRequest.Unvalidated] (http://msdn.microsoft.com/en-us/library/system.web .httprequest.unvalidated (v = VS.110) .aspx) proprietà. –

Problemi correlati