[SOLUCIONADO] Problema captcha y proxy

hola, en la universidad estamos detrás de un proxy, con el captcha configurado en true, anda en los intentos fallidos del login, pero en la parte de recuperar contraseña no funciona. Sin el proxy configurado da un error de que no se puede conectar al socket (da un timeout) y con el proxy configurado no hace la validación. Que podemos hacer?

Saludos
Maxi

Hola Maxi, esto en que versión del 3W?

Envíame los logs cuando queres recuperar la contraseña y te falla el captcha.

saludos.

Detecté que al intentar usar XDEBUG a pesar de tener tildada la opción “no usar proxy para direcciones locales” cuando desde el server se busca la IP del host cliente se muere en la IP del proxy y no llega a conectar xdebug con el IDE de desarrollo. Eso se soluciona simplemente desabilitando el proxy en el navegador usado para debug y listo.

Es probable que esté pasando algo similar con el captcha, pero podés desabilitar el proxy sólo si podés configurar el acceso a internet sin proxy (el captcha necesita internet… si no tenés no funcionará)

La version de 3w es la 3.11.0

Adjunto los logs.

Saludos
Maxi


logs g3w3.zip (34 KB)

Hola Maxi, ese error también se da cuando ponen mal el captcha, te pediría los siguiente:

en el archivo src/siu/extension_kernel/controlador_g3w2.php función check_recaptcha agregar los siguientes klog2:


protected function check_recaptcha()
    {
        if (! kernel::proyecto()->usa_captcha()) {
            return true;
        }
        $remote_addr = $_SERVER["REMOTE_ADDR"];
        $recaptcha_challenge_field = kernel::request()->getPost('recaptcha_challenge_field');
        $recaptcha_response_field = kernel::request()->getPost('recaptcha_response_field');
        
        //Escribo en los logs
        klog2("recaptcha_challenge_field", $recaptcha_challenge_field);
        klog2("recaptcha_response_field", $recaptcha_response_field);
        
        require_once(\realpath(guarani::dir().'/lib/recaptcha/recaptchalib.php'));
        $private_key = kernel::proyecto()->get_captcha_private_key();
        $parametros_extra = array();
        if(kernel::proyecto()->usa_proxy()) {
            $parametros_extra['parametros_proxy'] = kernel::proyecto()->get_parametros_proxy();
            //Escribo en los logs
            klog2("parametros_proxy", $parametros_extra['parametros_proxy']);
        }
        if ($recaptcha_response_field) {
            $resp = recaptcha_check_answer ($private_key,
                $remote_addr,
                $recaptcha_challenge_field,
                $recaptcha_response_field,
                $parametros_extra);

            if ($resp->is_valid) {
                return true;
            } else {
                return false;
            }
        }

        return false;
    }

luego vuelvan a enviar los logs cuando el captcha falla.

saludos.

adjunto los logs.


20160504_120907___8698.log.zip (4.09 KB)

Hola Maxi, por lo que veo no esta entrando al if de usa_proxy:


        if(kernel::proyecto()->usa_proxy()) {
            $parametros_extra['parametros_proxy'] = kernel::proyecto()->get_parametros_proxy();
        }

pregunta, como tenes configurado el parámetro activo del proxy en el archivo config.php?, tendría que ser true, ya que si pones 1 u otro valor que evalúe a true no va a funcionar ya que se usa un ===

src/siu/bootstrap.php


$usa_proxy = (isset($config_final['proxy']['activo']) && $config_final['proxy']['activo'] === true);

saludos.

asi:

'proxy' => array( 'activo' => true, 'proxy_host' => '170.210.96.10', 'proxy_port' => 8080, 'proxy_username' => '', 'proxy_password' => '' ),

si lo pongo en ‘true’ con comillas me da el error Could not open socket

es raro que en el log no escriba la entrada parametros_proxy, vos agregaste el siguiente klog2?


.............................
if(kernel::proyecto()->usa_proxy()) {
            $parametros_extra['parametros_proxy'] = kernel::proyecto()->get_parametros_proxy();
            //Escribo en los logs
            klog2("parametros_proxy", $parametros_extra['parametros_proxy']);
        }
.............................

si no queres que los parámetros salgan en los logs pone otra cosa de ultima:


klog2("entro al if de usa_proxy", true);

saludos.

no lo habia visto, ahi se lo agregue y adjunto los logs nuevamente.


20160505_084121___6927.log.zip (4.15 KB)

Hola Maxi, me extraña que en el login funcione y en recuperar contraseña no, ya que hacen lo mismo.

Sigamos debugeando, te pediría que en el archivo src/siu/extension_kernel/controlador_g3w2.php función check_recaptcha agregues el siguiente klog2 para ver si la respuesta del captcha tiene algún error que nos ayude a detectar el problema:


........................
if ($recaptcha_response_field) {
            $resp = recaptcha_check_answer ($private_key,
                $remote_addr,
                $recaptcha_challenge_field,
                $recaptcha_response_field,
                $parametros_extra);

                 klog2("recaptcha_response", get_object_vars($resp));
........................

luego volve a reproducir el caso y envíame los logs nuevamente.

También verifica las claves publicas y privadas que tenes configuradas para el captcha (config.php):


'captcha' =>
                array(
                    'activo' => true,
                    'intentos_login' => 3,
                    'public_key' => 'xxxxxxxxxxxxxxxxxxxxxxxxxx',
                    'private_key' => 'yyyyyyyyyyyyyyyyyyyyyyyyyyy',
                ),

saludos.

adjunto el log, la config del captcha es la que viene por defecto:

'captcha' => array( 'activo' => true, 'intentos_login' => 3, 'public_key' => '6Ldja84SAAAAAKdiYZIbx6qjQMtAdzWXiW474_Af', 'private_key' => '6Ldja84SAAAAABchqHlz65yICNXJQ8ENbZpLvmS5', ),

des01.zip (5.13 KB)

Hola Maxi, no se si viste los logs, esta devolviendo lo siguiente:


--  recaptcha_response  --------------------------------------------------------

Array
(
    [is_valid] => 
    [error] => Host: www.google.com
)

esto es lo que devuelve la respuesta del captcha, is_valid es false y el error dice “Host: www.google.com”, estuve googleando un poco pero no encontré nada al respecto, para mi el error viene por que el proxy esta teniendo problemas con www.google.com, revisen eso. Tienen acceso a http://www.google.com/recaptcha/api/verify estando bajo el proxy?

También busquen en google con frases como “recaptcha error Host: www.google.com using proxy”.

saludos.

Ademas de lo anterior, esto te pasa solo en esta instalación/ambiente o te sucede en otras instalaciones/ambientes?

que versión de PHP y Apache tenes instalada?

para seguir debugeando te pediría lo siguiente, en el archivo src/siu/lib/recaptcha/recaptchalib.php función _recaptcha_http_post agrega los siguientes tres klog2 y volveme a enviar los logs una vez mas:


function _recaptcha_http_post($host, $path, $data, $port = 80) {
....................................................

		$response = '';
		if ($usa_proxy) {
			if (!empty($proxy_username)) {
				$auth_string = base64_encode($proxy_username . ($proxy_password != '' ? ":{$proxy_password}" : ''));
				$http_request .= "Connection: close\r\n";
				if ( !empty($auth_string ) ) $http_request .= "Proxy-Authorization: Basic {$auth_string}\r\n";
			}
			if( false == ( $fs = @fsockopen($proxy_host, $proxy_port, $errno, $errstr, 10) ) ) {
				die ('Could not open socket');
			} 
		} else {
			 if( false == ( $fs = @fsockopen($host, $port, $errno, $errstr, 10) ) ) {
				die ('Could not open socket');
			} 
		}

    //Escribo en los logs
    klog2("errno", $errno);
    klog2("errstr", $errstr);

        fwrite($fs, $http_request);

        while ( !feof($fs) )
                $response .= fgets($fs, 1160); // One TCP-IP packet
                
                //Escribo en los logs
                klog2("response", $response);

                fclose($fs);
        $response = explode("\r\n\r\n", $response, 2);

        return $response;
}

por nuestra parte vamos a intentar reproducir el caso, saludos.

van los logs!


logs_g3w3.zip (15.3 KB)

Hola Maxi, según veo en los logs da un error, seguramente es por el proxy, no se si vos también estas viendo los logs antes de enviármelos?, lo ideal es que busquemos una solucion de los dos lados, dice:


--  errno  ---------------------------------------------------------------------

0

--  errstr  --------------------------------------------------------------------



--  response  ------------------------------------------------------------------

HTTP/1.0 400 Bad Request
Server: squid/2.7.STABLE9
Date: Tue, 10 May 2016 17:20:28 GMT
Content-Type: text/html
Content-Length: 2552
X-Squid-Error: ERR_INVALID_REQ 0
X-Cache: MISS from proxy.unlu.edu.ar
X-Cache-Lookup: NONE from proxy.unlu.edu.ar:8080
Via: 1.0 proxy.unlu.edu.ar:8080 (squid/2.7.STABLE9)
Connection: close

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>ERROR: El URL solicitado no se ha podido conseguir</title> <style type="text/css"><!--   %l  body :lang(fa) { direction: rtl; font-size: 100%; font-family: Tahoma, Roya, sans-serif; float: right; } :lang(he) { direction: rtl; }  --></style> </head><body id=ERR_INVALID_REQ> <div id="titles"> <h1>ERROR</h1> <h2>El URL solicitado no se ha podido conseguir</h2> </div> <hr>  <div id="content"> <p><b>Petición Incorrecta</b> se ha encontrado un error mientras se intentaba procesar la petición:</p>  <blockquote id="data"> <pre>POST /recaptcha/api/verify HTTP/1.0
Host: www.google.com
Content-Type: application/x-www-form-urlencoded;
Content-Length: 386
User-Agent: reCAPTCHA/PHP

privatekey=6Ldja84SAAAAABchqHlz65yICNXJQ8ENbZpLvmS5&amp;remoteip=127.0.0.1&amp;challenge=03AHJ_Vuvdkt4nzT4IMoOB28T7BvI73xgtVa7IV3op98qA933xRzUpLj2BO-plQzwcNVBUhPg0kPgRnVXp4yPdnMSpbggOSnPdMvcReEJVF1CpOb74kxkYfG5QgoZdYmpNQWEulIOzfIf1X1GsMaU1DzO6qL-BA2d1AbljWmbVLxsCwh-NfUyCS_FTOjAiMmngJkNm0jsgAxrTAzpnZeXfYX8mmyxNLN2aCDWLEmXBis6ZEN4VIddNZi9SI0AksHfzS4lypC5WkBJUKE2TVI-zpB670IkMGkqW8g&amp;response=214</pre> </blockquote>  <p>Algunos posibles problemas son:</p> <ul> <li id="missing-method"><p>Falta o es desconocido el m&eacute;todo de la petici&oacute;n (no es GET ni POST)</p></li> <li id="missing-url"><p>URL Perdido.</p></li> <li id="missing-protocol"><p>Falta el identificador HTTP (HTTP/1.0)</p></li> <li><p>La petición es demasiado grande.</p></li> <li><p>Falta Content-Length en las peticiones POST o PUT</p></li> <li><p>Hay caracteres ilegales en el nombre de m&aacute;quina; el car&aacute;cter subrayado (_) no est&aacute; permitido.</p></li> <li><p>HTTP/1.1 <q>Esperado:</q> la característica ha sido requerida desde un software HTTP/1.0.</p></li> </ul>  <p>Su administrador del cach&eacute; es <a href="mailto:webmaster">webmaster</a>.</p> 
 </div>  <script language="javascript"> if ('[unknown method]' != '[unknown method]') document.getElementById('missing-method').style.display = 'none'; if ('[no URL]' != '[no URL]') document.getElementById('missing-url').style.display = 'none'; if ('[unkown protocol]' != '[unknown protocol]') document.getElementById('missing-protocol').style.display = 'none'; </script>  <hr> <div id="footer"> <p>Generado Tue, 10 May 2016 17:20:28 GMT por proxy.unlu.edu.ar (squid/2.7.STABLE9)</p> <!-- ERR_INVALID_REQ --> </div> </body></html> 

--  recaptcha_response  --------------------------------------------------------

Array
(
    [is_valid] => 
    [error] => Host: www.google.com
)

buscando un poco te sugiero probar con lo siguiente:

  1. corre el siguiente comando en la consola: export http_proxy=‘http://proxy.unlu.edu.ar:8080 ([ubuntu] Download entire site with wget from localhost proxy)

  2. en el archivo src/siu/lib/recaptcha/recaptchalib.php función _recaptcha_http_post arriba de todo agrega global $fs; (php - fsockopen not working? - Stack Overflow):


function _recaptcha_http_post($host, $path, $data, $port = 80) {

        $usa_proxy = false;
        global $fs;
        ..........................................
	..........................................
        ..........................................
        return $response;
}

vuelvan a probar con esas modificaciones. saludos.

Revisando las peticiones en el proxy encontramos que es un bug de la libreria, en la peticion que le realiza al proxy, lo solucionamos modificando el archivo [b]g3w3/src/siu/lib/recaptcha/recaptchalib.php[b] agregando la linea $path=“http://” . $host . $path;.

... function _recaptcha_http_post($host, $path, $data, $port = 80) {
    $usa_proxy = false;

	if (isset($data['parametros_proxy'])) {
		$usa_proxy = $data['parametros_proxy']['activo'] === true;
		$proxy_host = $data['parametros_proxy']['proxy_host'];
		$proxy_port = $data['parametros_proxy']['proxy_port'];
		$proxy_username = $data['parametros_proxy']['proxy_username'];
		$proxy_password = $data['parametros_proxy']['proxy_password'];
		
                   $path="http://" . $host . $path;
		
    unset($data['parametros_proxy']);
	}

Saludos
Maxi

Hola Maxi, ante todo gracias por el aporte, vamos a probarlo y de ser necesario lo vamos a incorporar en las próximas versiones.

saludos.