Можно ли обмануть HttpRequest.Current.Request.IsLocal? - PullRequest
10 голосов
/ 25 марта 2009

Я запускаю веб-приложение, которое отображает некоторые способы отладки, если оно запускается локально - кавычки вокруг строк ресурсов и т. Д. - и я хотел бы продемонстрировать приложение на своем ноутбуке на конференции, где у меня не будет Интернета доступ, поэтому он должен быть локальным.

Приложение использует HttpContext.Current.Request.IsLocal, чтобы определить, работает ли он локально - есть ли способ обмануть его? Я хотел бы заставить его вернуть «Ложь», хотя я действительно бегу локально.

У меня есть доступ к исходному коду (и я понимаю, что могу просто продемонстрировать сборку, в которой закомментирована проверка IsLocal), но я бы не стал делать специальную сборку для этой демонстрации. Если понадобится, я сделаю это, но я бы предпочел использовать существующую кодовую базу без изменений.

Ответы [ 4 ]

17 голосов
/ 14 марта 2012

Request.IsLocal свойство реализует следующий код:

public bool IsLocal { 
            get {
                String remoteAddress = UserHostAddress; 

                // if unknown, assume not local
                if (String.IsNullOrEmpty(remoteAddress))
                    return false; 

                // check if localhost 
                if (remoteAddress == "127.0.0.1" || remoteAddress == "::1") 
                    return true;

                // compare with local address
                if (remoteAddress == LocalAddress)
                    return true;

                return false;
            } 

Источник: декомпилированный исходный код (Microsoft: referenceource.microsoft.com )

Надеюсь, это поможет!

3 голосов
/ 25 марта 2009

Это потребует подмены нелокального IP-адреса в запросах к вашему локальному экземпляру IIS. Я думаю, что вы, вероятно, потратите меньше времени на создание демо-сборки, чем на эту работу.

1 голос
/ 17 декабря 2015

Если ваш сервер имеет несколько IP-адресов, вам понадобится дополнительный код. Следующее обрабатывает несколько IP-адресов и обрабатывает CDN как cloudflare, который будет иметь неправильный IP-адрес в свойстве Request.UserHostAddress.

Код:

private bool IsLocal()
{
    if (Request.IsLocal)
    {
        return true;
    }
    string forwardIP = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
    foreach (NetworkInterface netInterface in NetworkInterface.GetAllNetworkInterfaces())
    {
        IPInterfaceProperties ipProps = netInterface.GetIPProperties();
        foreach (UnicastIPAddressInformation addr in ipProps.UnicastAddresses)
        {
            string ipString = addr.Address.ToString();
            if (Request.UserHostAddress == ipString || forwardIP == ipString)
            {
                return true;
            }
        }
    }
    return false;
}
1 голос
/ 25 марта 2009

Я верю, что это правда, но не могу проверить прямо сейчас.

IsLocal возвращает True, когда сайт привязан к адресу обратной связи 127.0.0.1.

Если в IIS вы убедитесь, что ваш веб-сайт привязан к одному из петлевых адресов вашего компьютера (т. Е. 192.168.1.100), то IsLocal должен вернуть False.

Кассини, по определению, всегда локальный, поскольку может связываться только с адресом обратной связи.

...