2009-03-25 7 views
9

Sto eseguendo un'applicazione web che mostra un comportamento di debug se viene eseguita localmente - cita le stringhe di risorse, ecc. - e mi piacerebbe provare l'applicazione sul mio portatile ad una conferenza dove non avrò accesso ad internet , quindi deve essere locale.Posso ingannare HttpRequest.Current.Request.IsLocal?

L'applicazione utilizza HttpContext.Current.Request.IsLocal per determinare se è in esecuzione localmente - esiste un modo per ingannarlo? Mi piacerebbe ingannarlo nel restituire "False" anche se sto correndo localmente.

Ho accesso al codice sorgente (e mi rendo conto che potrei semplicemente provare una build in cui il controllo "IsLocal" è commentato), ma preferirei non creare una build speciale per questa demo. Se necessario, lo farò, ma preferirei usare la base di codice esistente intatta.

+0

distribuirlo a un altro server sulla stessa rete. –

+0

Sto usando questa installazione per una demo dell'applicazione non in rete, e avrò solo il mio laptop lì. Ho giocato con una macchina virtuale sul mio portatile, anche se temo che la velocità ostacolerebbe la mia demo. – SqlRyan

risposta

3

Ciò richiederebbe lo spoofing di un indirizzo IP non locale nelle richieste all'istanza locale di IIS. Penso che probabilmente impiegheresti meno tempo a creare una demo piuttosto che provare a farlo funzionare.

+0

Questo è quello che temevo, ma stavo pensando che avrei dovuto seguire quella strada. Ho solo pensato che ci potrebbe essere qualcosa di veloce che ho trascurato. – SqlRyan

1

Credo sia vero, ma non posso verificarlo adesso.

IsLocal restituisce True quando il sito è associato all'indirizzo di loopback 127.0.0.1.

Se in IIS si assicura che il sito Web sia associato a uno degli indirizzi non di loopback della macchina (ad esempio 192.168.1.100), IsLocal deve restituire False.

Cassini, per definizione, è sempre locale, poiché può collegarsi solo all'indirizzo di loopback.

+0

Ho avuto un barlume di speranza, ma questo non sembra funzionare nel mio ambiente - IIS6 o 7. Puoi dare una possibilità a questo quando ne hai la possibilità, e se riesci a farlo funzionare, vorrei amo sapere come. – SqlRyan

+0

Se è legato a '192.168.1.100', il' remoteAddress == LocalAddress' (come remoto sarà '192.168.1.100' troppo) check sarà true quindi restituirà' true'. – SilverlightFox

16

proprietà Request.IsLocal implementa il seguente codice:

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

Fonte: decompilato il codice sorgente (Microsoft: referencesource.microsoft.com)

Spero che questo aiuti!

1

Se il server ha più indirizzi IP, è necessario un po 'di codice aggiuntivo. Il seguente gestisce più indirizzi IP e gestisce CDN come cloudflare che avrà l'indirizzo IP errato nella proprietà Request.UserHostAddress.

Codice:

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 può essere falsificato, quindi se non si sta utilizzando un CDN è probabilmente meglio rimuoverlo completamente. – jjxtra

Problemi correlati