2009-04-15 15 views
27

Si Request.ServerVariables ["HTTP_X_FORWARDED_FOR"] devuelve varias ip, ¿cuál debo tomar y cómo lo haré en C#? Tengo entendido que si está en blanco o nulo, la computadora cliente no pasará por un proxy y puedo obtener su ip de Request.ServerVariables ["REMOTE_ADDR"]. ¿Es esta una declaración correcta?¿Cómo obtengo la dirección IP correcta de HTTP_X_FORWARDED_FOR si contiene varias direcciones IP?

Por "cuál tomaré", quiero decir, ¿tomo la primera IP de la lista o la última IP y es todo lo que tengo que hacer es simplemente dividirla en una matriz y tomar la que yo quiera. No estoy seguro de cómo funciona HTTP_X_FORWARDED_FOR.

Respuesta

35

Según this, el formato de X-reenvía Para encabezado HTTP es:

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

Así que la dirección IP del cliente que desea debe ser el primero en la lista

2

Una nota adicional sobre la fiabilidad Asunto:

Cualquiera puede forjar HTTP_X_FORWARDED_FOR mediante el uso de una herramienta como el plugin Firefox "Datos Tamper" o su propio proxy local (por ejemplo Privoxy). Esto significa que toda la cadena puede ser falsa, y REMOTE_ADDR es el host original real. También podría significar que la primera dirección "client1" es falsa, y luego el cliente se conectó a través de un proxy, lo que resulta en que proxy1 es la dirección IP del cliente y REMOTE_ADDR es el único proxy utilizado.

Si está buscando denegar el acceso basado en IP, le sugiero que compruebe todas las direcciones IP en el encabezado XFF así como en REMOTE_ADDR.

Si está buscando otorgar acceso según la región de una IP, le sugiero que permita el acceso solo si XFF está en blanco y la IP es del área adecuada.

Como ya se mencionó en Mastermind, hay proxies que ocultan la cadena de proxies. Por ejemplo, la red Tor hará que una solicitud aparezca como si proviniera de la máquina proxy final, en lugar de la IP original. Los proxies anónimos suelen afirmar que están reenviando por la misma IP que se informó en REMOTE_ADDR.

El filtrado basado en IP es generalmente un mecanismo de control de acceso bastante crudo y de último recurso.

+0

¿por qué las empresas como AWS y Azure confían en la dirección IP para configurar las reglas del grupo de seguridad? –

0

La dirección IP del cliente real debe ser la dirección IP más a la izquierda en el valor del encabezado. Se puede extraer en una variable de entorno utilizando una expresión regular:

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

Nota el uso de $ 1 para establecer la variable de entorno XFFCLIENTIP para mantener el contenido del primer grupo en la expresión regular (entre paréntesis).

Como ejemplo de uso de esto, puede definir un formato de registro que use la variable: este ejemplo es uno que usamos internamente en nearmap.com, por lo que registra información adicional, pero el bit que desea es % {XFFCLIENTIP} e al principio. Tenga en cuenta env = XFFCLIENTIP al final de la línea, lo que significa que este formato solo se usa si se establece la variable de entorno.

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