Могу ли я обмануть HttpRequest.Текущий.Запрос.IsLocal?
-
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;
}