Вопрос

По вполне очевидным причинам я хотел бы определить лучший способ предотвратить захват Auth_Password ELMAH.Как лучше всего это сделать?

Это было полезно?

Решение

Поскольку ELMAH имеет открытый исходный код, я изменил файл Error.CS следующим образом.Внутри конструктора ошибок Error.CS (около строки 126) я добавил это:

_serverVariables.Remove(AUTH_PASSWORD);
//AUTH_PASSWORD = const string = "AUTH_PASSWORD" AND SET ELSEWHERE

Другие советы

Мне удалось сделать это, не изменяя исходный код ELMAH: http://www.kipusoep.nl/2012/01/06/umbraco-elmah-with-sql-ce-4-0-and-authentication-part-2/

Я только что столкнулся с тем же самым;решено с помощью следующего:

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

И обновил модуль ErrorLog в web.config, Configuration/system.webserver/modules, чтобы:

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

Это решит проблему без повторного путешествия туда и обратно.Не проблема, если впоследствии пароль будет использован из входящего запроса, поскольку источник Elmah показывает, что он принимает копию.

Я понимаю, что немного опоздал с ответом на вышеизложенное, но проблема, похоже, исправлена ​​в текущей версии Elmah для ASP, а не в пакете Nuget Elmah.Mvc.

Мне не удалось заставить работать ответ @Dominic Birch, потому что контекст доступен только для чтения.Вместо этого я извлек из ErrorLog (в моем случае 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);
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top