Dans ELMAH avec MVC 3, comment puis-je masquer des données de formulaire sensibles dans le journal des erreurs?

Voici le scénario …

L’utilisateur tape son nom d’utilisateur. Tape un mot de passe “incorrect”. Le nom d’utilisateur et le mot de passe sont tous deux transmis au journal des erreurs Elmah via Exception.Context.Request.Form["Password"] . C’est une valeur en lecture seule et ne peut pas être modifiée.

Et non … Je ne veux pas rejeter l’exception (échec). Nous avons ajouté le filtrage par erreur ErrorLog par programme:

 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 } } 

Mais ne peut pas modifier le Request.Form afin que le mot de passe soit caché de notre journal des erreurs.

Quelqu’un a-t-il déjà trouvé un moyen de contourner cela?

Je veux fondamentalement toutes les données d’erreur sans le champ mot de passe. Nous avons envisagé de le journaliser manuellement, mais cela semblait être beaucoup de travail par rapport à simplement cacher les données sensibles.

Acclamations gars. Merci d’avance.

Vous ne pouvez pas modifier la collection de formulaires sur la demande, mais vous pouvez modifier la collection de formulaires sur une erreur Elmah Error, puis la consigner manuellement. C’est à dire

 public static class ElmahSensitiveDataFilter { public static void Apply(ExceptionFilterEventArgs e, HttpContext ctx) { var sensitiveFormData = ctx.Request.Form.AllKeys .Where(key => key.Equals("password", SsortingngComparison.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(); } } 

Puis dans Global.asax

 void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e) { var ctx = e.Context as HttpContext; if(ctx == null) { return; } ElmahSensitiveDataFilter.Apply(e, ctx); } 

Attrapez l’exception, puis enregistrez quelque chose dans ELMAH manuellement, comme ceci:

 catch (LogOnException e) { Elmah.ErrorSignal.FromCurrentContext().Raise(new Exception("Bad Password")); } 

Vous ne pouvez le faire que si vous modifiez la source elle-même. Vous pouvez certainement modifier la configuration et y append la notion d’un “Éléments de formulaire exclus”, puis lorsque la classe Error copie la collection à partir du HttpContext, vous pouvez supprimer tous les éléments de cette liste.

Une autre solution consisterait évidemment à utiliser quelque chose d’autre, offrant un contrôle plus explicite sur le processus de journalisation, comme EntLib ou log4net. Il est facile d’écrire un module ou un gestionnaire d’exception global pour utiliser l’un ou l’autre de ces outils. De plus, ils sont pertinents dans des domaines autres que les applications Web.