2011-07-16 18 views
9

Estoy construyendo un sitio que está diseñado para ser administrado desde localhost, pero contiene páginas que exponen los datos a Internet o usuarios de la red local. ¿Puedo confiar en PHP $ _SERVER ['REMOTE_ADDR'] como una manera segura/confiable de identificar al usuario como localhost? Gracias!

Editar: Para aclarar, yo soy sólo se refiere a la determinación de si o no la solicitud se originó localhost (tal vez hay una mejor manera).

+0

Es bastante fiable para eso, sí. Y no hay necesidad de aclarar, entendimos;) –

Respuesta

10

Esa variable está llena de datos proporcionados por Apache (u otro daemon del servidor web) y debe ser confiable para identificar la dirección IP en el otro extremo de la conexión, sí. Compruebe si hay 127.x.x.x (casi siempre 127.0.0.1) y :: 1 (para IPv6). Como dice Senica, puede que no siempre exista (por ejemplo, cuando se ejecuta desde la línea de comandos en lugar de a través del servidor web). Pero si está lleno, debería ser confiable.

Para poder falsificarlo, alguien ya necesita un acceso bastante amplio a su red y sistema de una manera que no puede proteger contra PHP de todos modos.

+0

Gracias por la respuesta. Este sitio está destinado a ser utilizado por los clientes para su uso en sus propios servidores. Me preocupa que este enfoque pueda causar que los clientes experimenten un comportamiento incoherente en las configuraciones del servidor (ya que no puedo garantizar que se devolverá algo) – leo

+1

Luego debe hacer los controles como se define arriba. Si REMOTE_ADDR no está configurado, no entrará como una solicitud HTTP. Las posibilidades de que sean escasas o nulas (y cualquiera capaz de ejecutar su secuencia de comandos de esa manera debe ser lo suficientemente competente como para saber que existen controles de IP). No te preocupes por los casos extremos. Si comprueba 127.x.x.x y :: 1, habrá cubierto todas las configuraciones sanas. –

+0

Gracias por aliviar mi paranoia. – leo

0

No. Depende del servidor web si es remote_addr sirve o no.

RETRACT QUE. ... estaba pensando en HTTP_REFERER.

hay que darle la dirección IP ... sí. Recuerde que podría haber un proxy.

+0

'HTTP_REFERER' en realidad depende del navegador, no del servidor. –

-1

Esto puede no ser aplicable generalmente a las conexiones desde localhost pero se debe tener en cuenta los proxies. Si el extremo remoto está utilizando un proxy HTTP, $_SERVER['REMOTE_ADDR'] contendrá la dirección IP de ese proxy en lugar de la dirección IP del cliente.

Sin embargo, si se trata de un proxy que tiene la configuración de privacidad desactivado, entonces usted puede tener la oportunidad de obtener la IP del cliente utilizando el siguiente fragmento:

// will be set by the proxy if no privacy is enabled: 
if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
    return $_SERVER['HTTP_X_FORWARDED_FOR']; 
} else if(isset($_SERVER['REMOTE_ADDR'])) { 
    return $_SERVER['REMOTE_ADDR']; 
} 

Pero si su cliente está utilizando un proxy HTTP con la privacidad habilitado, entonces no tendrá la oportunidad de obtener IP de los clientes.


Seguridad Indirecta (gracias @deceze) Tenga en cuenta que si se basan en la cabecera HTTP_X_FORWARDED_FOR, será fácil para los atacantes falsificar su IP. Aunque esto también es posible utilizando otras técnicas, será muy fácil utilizar el encabezado HTTP_X_FORWARDED_FOR. Usted ha sido advertido. Pero de todos modos una aplicación web nunca debe utilizar la información de IP para la seguridad, por lo tanto, es sólo una nota lateral

+0

1) Al usar encabezados X-Forwarded-For * en lugar de * 'REMOTE_ADDR' le da a cualquiera una gran manera de falsificar su dirección IP muy fácilmente; si lo usa * además de * 'REMOTE_ADDR' como metainformación 2)' isset &&! empty' es redundante, solo '! empty' funcionará bien. – deceze

+0

@deceze ¡Muchas gracias por la pista de spoofing! Nunca pensé sobre esto ... a 2.), eso no es correcto, no son lo mismo: revisen [este violín] (http://phpfiddle.org/lite/code/6c9-8zz) – hek2mgl

+0

Dije ' isset &&! empty' no tiene sentido, no es que sean lo mismo. – deceze

Cuestiones relacionadas