2011-01-23 19 views
72

¿Es seguro confiar en $_SERVER['REMOTE_ADDR']? ¿Puede ser sustituido cambiando el encabezado de la solicitud o algo así?

¿Es seguro escribir algo así?

if ($_SERVER['REMOTE_ADDR'] == '222.222.222.222') { // my ip address 
    $grant_all_admin_rights = true; 
} 
+3

Agregando a las respuestas existentes, siempre será la dirección IP que realizó la solicitud a su servidor, pero eso no significa que sea la dirección IP de la computadora que inició la solicitud. Cualquier número de servidores proxy podría estar entre usted y el usuario final, y el más cercano a usted es la dirección IP que obtiene. –

+0

sí, es seguro porque no puede ser sustituido por otros trucos o trampas. pero asegúrese de agregar más control para la variable $ grant_all_admin_rights. –

+0

Cualquier variable $ _SERVER puede ser falsificada, p. curl_setopt ($ ch, CURLOPT_HTTPHEADER, array ("REMOTE_ADDR: $ ip", "HTTP_X_FORWARDED_FOR: $ ip")); Por lo tanto, depende completamente del contexto: si el atacante espera una respuesta, volverá a $ ip. Si no les importa la respuesta, ciertamente pueden falsificar el encabezado. Si su código después de la comprobación del encabezado en su lugar dijo: "open_the_door_to_badguys();" tendrías un problema – TMG

Respuesta

88

Sí, es seguro. Es la IP de origen de la conexión TCP y no se puede sustituir cambiando un encabezado HTTP.

Un caso es posible que desee preocuparse si está detrás de un proxy inverso, en cuyo caso REMOTE_ADDR siempre será la IP del servidor proxy y la IP del usuario se proporcionará en un encabezado HTTP (como X-Forwarded-For) Pero para el caso de uso normal, leer REMOTE_ADDR está bien.

+3

¿Qué pasa con la suplantación de direcciones IP? – Abdull

+0

@Abdull Las personas que pueden hacer eso suelen ser las mismas personas que tienen acceso físico a su caja. así que no te preocupes tanto por eso. – Behrooz

+3

@Abdull La suplantación de IP solo puede enviar mensajes de una manera, no puede suplantar su IP y recibir un mensaje a cambio. – Matth3w

52

$_SERVER['REMOTE_ADDR'] es la dirección IP a la que entró la conexión TCP. Si bien es técnicamente posible falsificar direcciones IP bidireccionales en Internet (al anunciar rutas ficticias a través de BGP), tales ataques probablemente sean detectados y no estén disponibles para el atacante típico; básicamente, su atacante debe tener control sobre un ISP o operador. No hay ataques de spoofing unidireccionales factibles contra TCP (todavía). Sin embargo, la suplantación de IP bidireccional es trivial en una LAN.

También tenga en cuenta que puede no ser un IPv4, sino una dirección IPv6. Su cheque actual está bien en ese sentido, pero si comprueba que 1.2.3.4 solo ocurre en cualquier parte dentro de $_SERVER['REMOTE_ADDR'], un atacante podría simplemente conectarse desde 2001:1234:5678::1.2.3.4.

En resumen, para cualquier otra cosa que no sean aplicaciones críticas (bancarias/militares/daños potenciales> 50,000 €), puede usar la dirección IP remota si puede excluir atacantes en su red local.

+4

Parece muy informado sobre el Protocolo de Internet. –

+0

@phihag, si '$ _SERVER ['REMOTE_ADDR']' es la dirección IP desde la que entró la conexión TCP depende completamente de su SAPI. – Pacerier

+0

está lejos de ser inviable para un atacante en una WLAN WPA/WPA para expulsar al cliente real, y suplantar esa dirección IP - WEP y WPA tienen debilidades que hacen que spoofing 'haya sido expulsado de los paquetes de wlan' fácil de crear con las herramientas correctas. Google 'test' WPA rebaja, por ejemplo – hanshenrik

3

Como se mencionó anteriormente, no es absolutamente seguro. Pero eso no significa que no deberías usarlo. Considere combinar esto con algunos otros métodos de autenticación, por ejemplo, verificar los valores de COOKIE.

+5

Después de una dirección IP spoofing, el cambio de la petición HTTP y el envío de falsas cookies es un pedazo de pastel ..... (o un pedazo de la galleta) –

+0

Por favor, explique qué quiere decir con "no absolutamente seguro " – Jake

Cuestiones relacionadas