c# - En ELMAH con MVC 3, ¿cómo puedo ocultar los datos confidenciales del formulario del registro de errores?
hide url mvc (3)
Capture la excepción, luego registre algo en ELMAH manualmente, como esto:
catch (LogOnException e)
{
Elmah.ErrorSignal.FromCurrentContext().Raise(new Exception("Bad Password"));
}
Aquí está el escenario ...
El usuario escribe su nombre de usuario. Escribe una contraseña "incorrecta". Los valores de nombre de usuario y contraseña se pasan al registro de errores de Elmah a través de Exception.Context.Request.Form["Password"]
. Es un valor de solo lectura y no se puede modificar.
Y no ... no quiero descartar la excepción (fallar). Agregamos ErrorLog Filtering programmatically:
void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e)
{
if (e.Exception is LogOnException)
{
((HttpContext) e.Context).Request.Form.Remove("Password");
// This is what we want to do, but we can''t because it is read-only
}
}
Pero no puede modificar el Request.Form para que la contraseña se oculte de nuestro registro de errores.
¿Alguna vez alguien ha encontrado una manera de evitar esto?
Básicamente quiero todos los datos de error sin el campo de contraseña. Consideramos registrarlo manualmente, pero parecía ser mucho trabajo en comparación con simplemente ocultar los datos confidenciales.
Animo amigos. Gracias por adelantado.
No puede modificar la colección de formularios en la solicitud, pero puede modificar la colección de formularios en un error Elmah y luego registrarla manualmente. Es decir
public static class ElmahSensitiveDataFilter
{
public static void Apply(ExceptionFilterEventArgs e, HttpContext ctx)
{
var sensitiveFormData = ctx.Request.Form.AllKeys
.Where(key => key.Equals("password", StringComparison.OrdinalIgnoreCase)).ToList();
if (sensitiveFormData.Count == 0)
{
return;
}
var error = new Error(e.Exception, ctx);
sensitiveFormData.ForEach(k => error.Form.Set(k, "*****"));
Elmah.ErrorLog.GetDefault(null).Log(error);
e.Dismiss();
}
}
Luego en Global.asax
void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e)
{
var ctx = e.Context as HttpContext;
if(ctx == null)
{
return;
}
ElmahSensitiveDataFilter.Apply(e, ctx);
}
No puedes hacer esto a menos que modifiques la fuente en sí. Ciertamente, podría modificar la configuración y agregar la noción de "Elementos de formulario excluidos" a eso, luego, cuando la clase Error copie la colección del HttpContext, puede eliminar cualquier elemento de esa lista.
Otra alternativa sería usar otra cosa, obviamente, que proporcione un control más explícito sobre el proceso de registro como EntLib o log4net. Es trivial escribir un módulo o un controlador de excepciones global para utilizar cualquiera de esas herramientas. Además, son relevantes en ámbitos fuera de las aplicaciones web.