MakeOn Posted October 11, 2017 Share Posted October 11, 2017 En todos los clientes se puede ver desde qué IP un cliente a conectado con tu página web: <-- Captura de pantalla Sin embargo si tienes clonada la página y es balanceada con un balaneador de carga esta IP captada siempre será la privada del balanaceador de carga en vez de la pública del cliente. (Por lo menos este es mi caso en PS1.7) Los balanceadores de carga al igual que los proxy normalmente inyectan la cabecera "X-Forwarded-For" donde se indica como valor la ip origen del cliente para que pueda ser recuperada posteriormente, Así pues en PHP con {$_SERVER['REMOTE_ADDR']} devuelve la IP origen si la conexión es directa y {$_SERVER['HTTP_X_FORWARDED_FOR']} devuelve la IP origen si se ha pasado a través de un Proxy o balanceador ya que en ese caso REMOTE_ADDR devuelve la IP del balanceador o Proxy. Ahora bien, revisando el código de Prestashop compruebo que este si contempla esto y debe hacer las comprobaciones oportunas Concretamente encuentro el comando en los siguientes archivos (PS 7.1): \classes\Tools.php (líneas 321, 334, 337,340, 341, 344) \vendor\symfony\symfony\src\Symfony\Component\HttpFoundation\Tests\RequestTest.php (Lineas 931, 963 y 1604) \vendor\symfony\symfony\src\Symfony\Component\HttpKernel\Tests\Fragment\InlineFragmentRendererTest.php (58, 174, 199) \vendor\symfony\symfony\src\Symfony\Component\HttpKernel\Tests\HttpCache\HttpCacheTest.php(Linea 1251) Sin embargo, a pesar de esto en las fichas de mis clientes solo se muestra la IP del balanceador ¿Prestashop no realiza correctamente esta comprobación? o es que debería cambiar algo? (Si creo un fichero PHP con estos valores los resultados son las IP que indico por lo que veo que todo concuerda con lo que indico) Un saludo y muchas gracias Link to comment Share on other sites More sharing options...
MakeOn Posted October 13, 2017 Author Share Posted October 13, 2017 A ver si algún gurú me puede dar algo de luz de lo que me está ocurriendo Buscando más información he dado con este topic:https://www.prestashop.com/forums/topic/300496-maintenance-ip-problems/ Ahí indicaron en uno de los post que una posible solución podría ser modificar el archivo \classes\Tools.php La modificación consiste en modificar el condicional de la línea 337 if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] && (!isset($_SERVER['REMOTE_ADDR']) || preg_match('/^127\..*/i', trim($_SERVER['REMOTE_ADDR'])) || preg_match('/^172\.16.*/i', trim($_SERVER['REMOTE_ADDR'])) || preg_match('/^192\.168\.*/i', trim($_SERVER['REMOTE_ADDR'])) || preg_match('/^10\..*/i', trim($_SERVER['REMOTE_ADDR'])))) { Por lo siguiente: if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] { Quedando pues la función así (tools.php en PS1.7): /** * Get the server variable REMOTE_ADDR, or the first ip of HTTP_X_FORWARDED_FOR (when using proxy) * * @return string $remote_addr ip of client */ public static function getRemoteAddr() { if (function_exists('apache_request_headers')) { $headers = apache_request_headers(); } else { $headers = $_SERVER; } if (array_key_exists('X-Forwarded-For', $headers)) { $_SERVER['HTTP_X_FORWARDED_FOR'] = $headers['X-Forwarded-For']; } if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] && (!isset($_SERVER['REMOTE_ADDR']) || preg_match('/^127\..*/i', trim($_SERVER['REMOTE_ADDR'])) || preg_match('/^172\.16.*/i', trim($_SERVER['REMOTE_ADDR'])) || preg_match('/^192\.168\.*/i', trim($_SERVER['REMOTE_ADDR'])) || preg_match('/^10\..*/i', trim($_SERVER['REMOTE_ADDR'])))) { if (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',')) { $ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); return $ips[0]; } else { return $_SERVER['HTTP_X_FORWARDED_FOR']; } } else { return $_SERVER['REMOTE_ADDR']; } } He probado a realizar esta modificación pero por el momento no consigo resultados y sigue apareciendo la IP del Balanceador Investigando he creado un fichero php independiente solo con esta función modificado, los return con echo y metiendo algún echo aparte para hacer seguimiento de en que if entra.El resultado es que me devuelve la IP real en vez del balancedor como debería ser (El penúltimo else) y sin embargo desde Prestashop parece ser que no existe esa cabecera ya que si modifico el último else que es el que coje prestashop y lo modifico por HTTP_X_FORWARDED_FOR para forzarlo lo que guarda es ip 0.0.0.0 (Puesto que si llega allí es porque el valor no existe o está vacío y por eso devuelve REMOTE_ADDR que es el balanceador de carga) No se si me he explicado correctamente =S¿Se os ocurre algo? Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now