validate google example jquery security captcha

jquery - google - Qaptcha-es efectivo?



recaptcha v2 (1)

Desafortunadamente, esto no parece ser un captcha seguro.

Al final de esta publicación hay un código de ejemplo que puede omitirlo. Escribí este script sin mirar ninguno de sus códigos fuente (php o javascript). Acabo de olfatear algunas solicitudes HTTP, vi lo que estaba haciendo y traté de emularlo. Ahora he mirado su código JS pero aún no es el PHP, así que incluso sin ver ningún código fuente, esto podría ser anulado.

Mi rápida conjetura sobre cómo funciona en base a los éxitos y los fracasos:

  • Usted carga el formulario en su página, se crea una sesión de PHP con presumiblemente sin datos.
  • Se carga una secuencia de comandos JS que genera una qaptcha_key y la agrega al formulario.
  • Esta clave es creada por JavaScript y no está almacenada en el servidor (todavía).
  • Mueve el control deslizante a la derecha, jQuery publica la "qaptcha_key" a PHP a través de Ajax y la clave se almacena en la sesión (la clave no es secreta).
  • Envíe el formulario que incluye la qaptcha_key que se habría enviado previamente a través de Ajax si moviera el control deslizante.
  • Si hay una qaptcha_key coincidente en la sesión (al mover el control deslizante), el formulario se considera válido. Si no hay una clave de este tipo, suponen que no movió el control deslizante (o que JS estaba deshabilitado), y como la sesión no contiene qaptcha_key, el formulario no es válido.

¿Se puede hacer más seguro? No fácilmente en mi opinión. Para estar seguro, el secreto debe almacenarse en el servidor, y no puede obtenerse fácilmente a través de cualquier script o solicitud HTTP al servidor. Es decir, hacer una solicitud Ajax basada en algún valor público para autenticarse puede ser falsificado utilizando solicitudes Ajax o HTTP como mi ejemplo a continuación. Básicamente, la solución captcha debe almacenarse en el servidor, e interpretarse por un ser humano (es de esperar que no sea una computadora) y enviarse de vuelta al servidor.

Aquí está el código que puede ejecutar para evitarlo. Básicamente, si ejecutas esto, verás:

Form can be submited First Name : A Test Last Name : Of Qaptcha

En la salida resultante. Como puede ver en el código, simplemente estoy usando la misma tecla una y otra vez. No importa cuál es la clave porque el cliente le informa al servidor de la clave y, cuando envía el formulario, Qaptcha solo comprueba si el valor enviado junto con el formulario coincide con lo que está almacenado en la sesión de PHP. Por lo tanto, el valor de la clave es irrelevante, solo tiene que decirle al servidor qué es antes de enviar el formulario.

Sospecho que es solo cuestión de tiempo antes de que los spammers implementen un bypass ampliamente utilizado para los formularios Qaptcha y lo integren en sus arañas.

La prueba de concepto:

<?php $COOKIE_FILE = ''/tmp/cookies.txt''; // The cookie file to use for storing the PHP session ID cookie $FIRST_NAME = ''A Test''; // first name to send $LAST_NAME = ''Of Qaptcha''; // last name to send if (file_exists($COOKIE_FILE)) unlink($COOKIE_FILE); // clear cookies on start - just prevents re-using the same PHPSESSID over and over $fake_qaptcha_key = ''thisIsAFakeKey12345''; // arbitrary qaptcha_key - normally generated by client JavaScript // fetch the form - this creates a PHP session and gives us a cookie (yum) $first = fetch_url(''http://demos.myjqueryplugins.com/qaptcha/''); // This step is important - this stores a "qaptcha_key" in the PHP session that matches our session cookie // We can make the key up in this step, it doesn''t matter what it is or where it came from $params = array(''action'' => ''qaptcha'', ''qaptcha_key'' => $fake_qaptcha_key); $second = fetch_url(''http://demos.myjqueryplugins.com/qaptcha/php/Qaptcha.jquery.php'', ''POST'', $params); // Now submit the form along with the same qaptcha_key we told the server about in the last step // As long as a form field is submitted that has the same name as the qaptcha_key we just told the server about, the captcha is bypassed $params = array(''firstname'' => $FIRST_NAME, ''lastname'' => $LAST_NAME, $fake_qaptcha_key => '''', ''submit'' => ''Submit Form''); $third = fetch_url(''http://demos.myjqueryplugins.com/qaptcha/'', ''POST'', $params); // echo the contents so you can see it said form was accepted. echo $third; // basic function that uses curl to fetch a URL with get/post function fetch_url($url, $method = ''GET'', $params = array()) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_COOKIEJAR, $GLOBALS[''COOKIE_FILE'']); curl_setopt($ch, CURLOPT_COOKIEFILE, $GLOBALS[''COOKIE_FILE'']); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); if ($method == ''POST'') { curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params)); } $return = curl_exec($ch); return $return; }

Espero que haya respondido la pregunta claramente para usted.

Vea la demostración de JQuery Qaptcha aquí - http://www.myjqueryplugins.com/QapTcha/demo

Requiere que deslices el control deslizante para desbloquear y probar que eres humano. He leído todo acerca de cómo establecer valores de campos aleatorios y borrarlos, pero ¿no se hace todo eso a través de una llamada de javascript? Y si es así, ¿no debería un bot simplemente ejecutar el método javascript y luego se rompe el qaptcha?

Ayúdame a entender cómo esto es seguro ...