代码之家  ›  专栏  ›  技术社区  ›  RSolberg

如何从elmah日志中删除“auth_password”

  •  9
  • RSolberg  · 技术社区  · 15 年前

    出于相当明显的原因,我想确定删除elmah捕获的auth_密码的最佳方法。最好的方法是什么?

    4 回复  |  直到 9 年前
        1
  •  9
  •   RSolberg    15 年前

    因为Elmah是开源的,所以我这样修改了error.cs文件。在error.cs的error cunstructor(关于第126行)中,我添加了以下内容:

    _serverVariables.Remove(AUTH_PASSWORD);
    //AUTH_PASSWORD = const string = "AUTH_PASSWORD" AND SET ELSEWHERE
    
        2
  •  1
  •   Joseph Daigle Sarabpreet Singh Anand    12 年前

    我在不修改elmah源代码的情况下成功地做到了这一点: http://www.kipusoep.nl/2012/01/06/umbraco-elmah-with-sql-ce-4-0-and-authentication-part-2/

        3
  •  0
  •   Dominic Birch    10 年前

    我也遇到过同样的事情;用以下方法解决了:

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

    并将web.config、configuration/system.webserver/modules中的错误日志模块更新为:

    <add name="ErrorLog" type="XXXX.ErrorLogModule" preCondition="managedHandler" />
    

    这将在不进行第二次往返的情况下解决问题。如果随后从传入请求中使用密码,则不会出现问题,因为elmah源显示密码需要一份副本。

    我意识到这有点晚了,但是这个问题似乎已经在当前的elmah for asp中得到了解决,而不是在elmah.mvc nuget包中得到了解决。

        4
  •  0
  •   Chris Hynes    9 年前

    我无法得到@DominicBirch的答案,因为上下文是只读的。相反,我从错误日志(在我的例子中是mysqlErrorLog)中派生出来,并在那里执行了以下操作:

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