2009-04-15 10 views
27

Se Request.ServerVariables ["HTTP_X_FORWARDED_FOR"] restituisce più IP, quale devo fare e come dovrei farlo in C#? Sono a conoscenza del fatto che se è vuoto o nullo, il computer client non sta passando attraverso un proxy e posso solo ottenere il loro ip da Request.ServerVariables ["REMOTE_ADDR"]. Questa è una dichiarazione corretta?Come ottengo l'IP corretto da HTTP_X_FORWARDED_FOR se contiene più indirizzi IP?

Con "quale scatto prendo", voglio dire, prendo il primo IP nell'elenco o l'ultimo IP e tutto ciò che devo fare è dividerlo in un array e prendere quello che voglio. Non sono davvero sicuro di come funzioni HTTP_X_FORWARDED_FOR.

risposta

35

Secondo this, il formato di X-Forwarded-For intestazione HTTP è:

X-Forwarded-For: client1, proxy1, proxy2, ... 

Quindi l'indirizzo IP del client che si desidera dovrebbe essere il primo della lista

2

Un ulteriore nota sull'affidabilità soggetto:

Chiunque può forgiare HTTP_X_FORWARDED_FOR utilizzando uno strumento come il plugin per Firefox "Tamper Data" o il proprio proxy locale (ad esempio Privoxy). Ciò significa che l'intera stringa potrebbe essere falsa e REMOTE_ADDR è l'host originale effettivo. Potrebbe anche significare che il primo indirizzo "client1" è falso, e quindi il client è connesso tramite un proxy, risultando in proxy1 l'indirizzo IP del client e REMOTE_ADDR come singolo proxy utilizzato.

Se si desidera negare l'accesso in base all'IP, suggerirei di controllare ogni indirizzo IP nell'intestazione XFF e REMOTE_ADDR.

Se si sta cercando di concedere l'accesso in base all'area di un IP, suggerirei di consentire l'accesso solo se XFF è vuoto e l'IP proviene dall'area appropriata.

Come già notato da Mastermind, tuttavia, esistono proxy che nascondono la catena di proxy. Ad esempio, la rete Tor farà apparire una richiesta come se provenisse dalla macchina del proxy finale, piuttosto che dall'IP originale. I proxy anonimi dichiarano spesso di inoltrare per lo stesso IP riportato in REMOTE_ADDR.

Il filtraggio basato su IP è generalmente un meccanismo di controllo degli accessi piuttosto scadente e di ultima istanza.

+0

quindi perché aziende come AWS e Azure fanno affidamento sull'indirizzo IP per configurare le regole del gruppo di sicurezza? –

0

L'IP del client effettivo deve essere l'indirizzo IP più a sinistra nel valore dell'intestazione. È possibile estrarre in una variabile d'ambiente utilizzando un'espressione regolare:

SetEnvIf X-Forwarded-For "^(\d{1,3}+\.\d{1,3}+\.\d{1,3}+\.\d{1,3}+).*" XFFCLIENTIP=$1 

Nota l'uso di $ 1 per impostare la variabile d'ambiente XFFCLIENTIP per contenere il contenuto del primo gruppo nel regex (tra parentesi).

Come esempio di utilizzo di questo, è possibile definire un formato di registro che utilizza la variabile: questo esempio è uno che utilizziamo internamente in nearmap.com, quindi registra ulteriori informazioni, ma il bit che desideri è lo % {XFFCLIENTIP} e all'inizio. Notare env = XFFCLIENTIP alla fine della riga, il che significa che questo formato viene utilizzato solo se è impostata la variabile di ambiente.

CustomLog /var/log/apache2/access.log "%{XFFCLIENTIP}e \"%{session}C\" \"%{nearmapuid}C\" %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" env=XFFCLIENTIP 
Problemi correlati