2009-03-25 8 views
9

Używam aplikacji sieci Web, która wyświetla pewne zachowanie debugowania, jeśli jest uruchamiana lokalnie - cudzysłowy wokół ciągów zasobów itd. - i chciałbym zaprezentować aplikację na moim laptopie podczas konferencji, na której nie będę mieć dostępu do Internetu , więc musi być lokalny.Czy mogę oszukać HttpRequest.Current.Request.IsLocal?

Aplikacja korzysta z HttpContext.Current.Request.IsLocal w celu ustalenia, czy działa lokalnie - czy istnieje sposób na oszukanie? Chciałbym oszukać go w powrocie "Fałszywe", mimo że faktycznie działam lokalnie.

Mam dostęp do kodu źródłowego (i zdaję sobie sprawę, że mogę po prostu demonstrować kompilację, w której skomentowano "IsLocal"), ale wolałbym nie budować specjalnie dla tego demo. Jeśli zajdzie taka potrzeba, zrobię to, ale wolę wykorzystać istniejącą bazę kodów nietkniętą.

+0

wdrożyć go na inny serwer w tej samej sieci. –

+0

Używam tej instalacji dla demo aplikacji nie połączonej w sieć, a będę miał tylko mój laptop. Na moim laptopie bawiłem się maszyną wirtualną, chociaż obawiam się, że prędkość hamowałaby moje demo. – SqlRyan

Odpowiedz

3

Wymagałoby to fałszowania nielokalnego adresu IP w żądaniach do lokalnej instancji IIS. Myślę, że prawdopodobnie poświęcisz mniej czasu na tworzenie demo niż na próbę wykonania tej pracy.

+0

Tego się obawiałem, ale myślałem, że muszę iść tą drogą. Po prostu pomyślałem, że może być coś szybkiego, czego przeoczyłem. – SqlRyan

1

Wierzę, że to prawda, ale nie można tego teraz zweryfikować.

IsLocal zwraca wartość True, gdy witryna jest powiązana z adresem zwrotnym 127.0.0.1.

Jeśli upewnisz się w IIS, że twoja witryna jest powiązana z jednym z adresów bez sprzężenia zwrotnego twojego komputera (tj. 192.168.1.100), to IsLocal powinien zwrócić False.

Cassini, z definicji, jest zawsze lokalna, ponieważ może wiązać się tylko z adresem pętli zwrotnej.

+0

Miałem promyk nadziei, ale to nie działa w moim środowisku - ani w IIS6, ani w 7. Czy możesz dać temu szansę, kiedy masz szansę, i jeśli uda ci się go uruchomić, uwielbiam wiedzieć jak. – SqlRyan

+0

Jeśli jest przypisany do "192.168.1.100", a następnie "remoteAddress == LocalAddress" (jako zdalny też będzie "192.168.1.100"), sprawdzenie będzie prawdziwe, więc zwróci wartość "true". – SilverlightFox

16

nieruchomość Request.IsLocal realizuje następujący kod:

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

Źródło: dekompilować kodu źródłowego (Microsoft: referencesource.microsoft.com)

nadzieję, że to pomaga!

1

Jeśli twój serwer ma wiele adresów IP, potrzebujesz dodatkowego kodu. Następujące obsługuje wiele adresów IP i obsługuje CDN, takie jak cloudflare, który będzie mieć nieprawidłowy adres IP we właściwości Request.UserHostAddress.

Kod:

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; 
} 
+0

HTTP_X_FORWARDED_FOR można sfałszować, więc jeśli nie korzystasz z CDN, prawdopodobnie lepiej jest usunąć go całkowicie. – jjxtra