2012-02-02 16 views
5

Ho un'applicazione MVC3 con un HandleErrorAttribute personalizzato in modo che possa inviare l'errore tramite posta elettronica. Ricevo spesso "Un valore Request.Form potenzialmente pericoloso rilevato dal client", ma mostra solo i primi caratteri del valore del modulo che ha causato l'eccezione. Mi piacerebbe vedere l'intero valore del modulo inserito per cercare di ottenere un'idea migliore se l'input fosse malevolo o accidentale da parte di un utente. Tuttavia, quando provo a estrarre i valori del form in HandleErrorAttribute, viene generato lo stesso errore! Qualche idea su come ottenere i valori del form da Request.Form senza causare la convalida nel mio gestore di eccezioni?Come si ottiene il valore del modulo che ha causato il "Rilevamento di un valore Request.Option potenzialmente pericoloso dal client" in MVC?

public class HandleErrorLogAttribute : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext context) 
    { 
     base.OnException(context); 

     //Record Error 
     string errorDetails = HttpUtility.HtmlEncode(context.Exception.ToString()); 

     // Throws "otentially dangerous..." error here 
     foreach (var key in context.RequestContext.HttpContext.Request.Form.AllKeys) 
     { 
      errorDetails += key + "=" + HttpUtility.HtmlEncode(context.RequestContext.HttpContext.Request.Form[key]); 
     } 

     // Send Email with errorDetails 
    } 
} 
+1

È possibile utilizzare '[ValidateInput (false)]' e convalidarlo da soli. –

+0

Va bene che genera un errore, voglio solo sapere quale input lo ha causato. Ho provato ad aggiungere [ValidateInput (false)] al mio metodo OnException, ma ha comunque restituito l'errore. – Austin

+0

Bene, 'ValidateInput' in realtà non" funziona "per questo, almeno non da solo. [Ecco perché.] (Http://stackoverflow.com/questions/807662/why-is-validateinputfalse-not-working/2530823#2530823) Il vero problema qui è che non esiste un modo sicuro per fare ciò che influirà solo su uno azione. È un'impostazione globale che riguarda l'intera app. –

risposta

12

In ASP.NET 4.5, sarà possibile utilizzare la nuova proprietà HttpRequest.Unvalidated.Form.

Fino ad allora, è possibile utilizzare la riflessione per leggere il HttpRequest._form campo privato:

HttpRequest request = context.RequestContext.HttpContext.Request; 
NameValueCollection form = (NameValueCollection)request.GetType().InvokeMember(
    "_form", 
    BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, 
    null, request, null); 

noti che _form è pigramente inizializzato dalla proprietà HttpRequest.Form, in modo da assicurarsi HttpRequest.Form è stata letta almeno una volta in anticipo.

+0

Buono a sapersi, grazie. – Austin

+0

Non sapeva di HttpRequest.Unvalidated.Form fino a poco tempo fa. Grazie. –

Problemi correlati