¿Es seguro confiar en $ _SERVER ['REMOTE_ADDR']?


89

¿Es seguro confiar $_SERVER['REMOTE_ADDR']? ¿Se puede sustituir 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.
Dan Grossman

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

Cualquier variable $ _SERVER puede ser falsificada, por ejemplo, curl_setopt ($ ch, CURLOPT_HTTPHEADER, array ("REMOTE_ADDR: $ ip", "HTTP_X_FORWARDED_FOR: $ ip")); Por tanto, depende totalmente 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 dice: "open_the_door_to_badguys ();" tendrías un problema.
TMG

3
@TMG No puede falsificar la $_SERVER['REMOTE_ADDR']variable configurando un encabezado de solicitud HTTP. PHP prefija automáticamente todos los encabezados de solicitud HTTP HTTP_cuando crea claves en el $_SERVERsuperglobal.
MrWhite

Respuestas:


110

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

Un caso del que puede que desee preocuparse es 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-Fordered-For ). Pero para el caso de uso normal, la lectura de REMOTE_ADDR está bien.


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

1
@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

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

1
¿Los enrutadores de Internet no comprueban la IP de origen y destino para enrutar paquetes? Dudo que un paquete falsificado llegue alguna vez al destino a través de los nodos de Internet.
Viktor Joras

57

$_SERVER['REMOTE_ADDR']es la dirección IP en la que entró la conexión TCP. Si bien es técnicamente posible falsificar direcciones IP bidireccionalmente en Internet (al anunciar rutas erróneas a través de BGP), es probable que dichos ataques sean detectados y no estén disponibles para el atacante típico; básicamente, su atacante debe tener control sobre un ISP o proveedor. No hay ataques de suplantación de identidad 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 que no sea una dirección IPv4, sino una dirección IPv6. Su verificación actual está bien en ese sentido, pero si verificara que 1.2.3.4solo ocurre en cualquier lugar dentro $_SERVER['REMOTE_ADDR'], un atacante podría simplemente conectarse desde 2001:1234:5678::1.2.3.4.

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


4
Suenas muy informado sobre el Protocolo de Internet.
Brian Peterson

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

está lejos de ser factible que un atacante en una WLAN WEP / WPA expulse al cliente real y falsifique esa dirección IP; tanto WEP como WPA tienen debilidades que you have been kicked off the wlanfacilitan la creación de paquetes de suplantación con las herramientas adecuadas. google WPA downgrade test, por ejemplo
hanshenrik

La dirección IP es a nivel de IP, no a nivel de TCP.
Viktor Joras

3

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


6
Después de suplantar una dirección IP, cambiar la solicitud http y enviar cookies falsas es pan comido ... (o un trozo de cookie)
Uri Goren

1
Explique lo que quiere decir con "no absolutamente seguro"
Jake
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.