Como remover “AUTH_PASSWORD” a partir de logs elmah
Pergunta
Por razões bastante óbvias, eu gostaria de identificar a melhor maneira de remover o AUTH_PASSWORD de ser capturado por ELMAH. Qual é a melhor maneira de ir sobre como fazer isso?
Solução
Desde ELMAH é open source, eu modifiquei o arquivo Error.CS assim. Dentro do cunstructor Erro de Error.CS (sobre a linha 126), eu adicionei o seguinte:
_serverVariables.Remove(AUTH_PASSWORD);
//AUTH_PASSWORD = const string = "AUTH_PASSWORD" AND SET ELSEWHERE
Outras dicas
Eu consegui fazer isso sem modificar a fonte ELMAH: http://www.kipusoep.nl/2012/01/06/umbraco-elmah-with-sql-ce-4-0-and-authentication- parte-2 /
Eu só encontrou a mesma coisa; resolvido usando o seguinte:
using Elmah;
using ElmahErrorLogModule = Elmah.ErrorLogModule;
namespace XXXX
{
public class ErrorLogModule : ElmahErrorLogModule
{
protected override void OnErrorSignaled(object sender, ErrorSignalEventArgs args)
{
// Remove password from the server variables being serialized
args.Context.Request.ServerVariables.Remove("AUTH_PASSWORD");
//TODO: remove session id, cookie too?
base.OnErrorSignaled(sender, args);
}
}
}
E atualizou o módulo ErrorLog em web.config, configuração / system.webServer / módulos para:
<add name="ErrorLog" type="XXXX.ErrorLogModule" preCondition="managedHandler" />
Isto irá resolver o problema sem uma segunda ida e volta. Não é um problema se a senha for posteriormente usado a partir da solicitação de entrada como mostra a fonte elmah que leva uma cópia.
Sei que isso é um pouco tarde, em resposta ao acima, mas o problema parece ter sido corrigido no atual Elmah para ASP, e não para o pacote NuGet Elmah.Mvc.
Eu não era capaz de obter resposta de trabalho de @Dominic Birch, porque o contexto é somente leitura. Em vez disso, eu derivado do ErrorLog (no meu caso, MySqlErrorLog) e fê-lo lá:
public class FilteringMySqlErrorLog : MySqlErrorLog
{
static readonly string[] _stripSearch = new[] { "password", "cardnumber", "ccnumber", "cvv" };
public FilteringMySqlErrorLog(IDictionary config)
: base(config)
{ }
public override string Log(Error error)
{
error.ServerVariables.Remove("AUTH_PASSWORD");
foreach (string key in error.Form.AllKeys.ToList())
{
if (_stripSearch.Any(x => key.IndexOf(x, StringComparison.InvariantCultureIgnoreCase) != -1))
error.Form.Remove(key);
}
return base.Log(error);
}
}