Могу ли я обмануть HttpRequest.Текущий.Запрос.IsLocal?

StackOverflow https://stackoverflow.com/questions/680079

  •  22-08-2019
  •  | 
  •  

Вопрос

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

Приложение использует HttpContext.Current.Запрос.IsLocal, чтобы определить, выполняется ли оно локально - есть ли какой-либо способ обмануть его?Я бы хотел обманом заставить его возвращать "False", даже если я действительно работаю локально.

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

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

Решение

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

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

Запрос.Свойство 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 : referencesource.microsoft.com )

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

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

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

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

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

Если ваш сервер имеет несколько IP-адресов, вам понадобится дополнительный код.Следующее обрабатывает несколько IP-адресов и обрабатывает CDN, подобный cloudflare, который будет иметь неправильный IP-адрес в запросе.Свойство 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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top