Utilizar reCAPTCHA v3 para evitar intentos de fuerza bruta

Iniciado por AlbertoBSD, 11 Diciembre 2019, 02:04 AM

0 Miembros y 1 Visitante están viendo este tema.

AlbertoBSD

Fuente Utilizar reCAPTCHA v3 para evitar intentos de fuerza bruta

En el Post que acabo de publicar básicamente se muestra el código en javascript y en PHP para implementar el reCAPTCHA v3 en un Formulario para evitar ataques de fuerza bruta.

Codigo en PHP:

Código (php) [Seleccionar]

<?php
try {
  
//Validar datos POST or GET aqui.
  
$post_data http_build_query(
    array(
        
'secret' => "SECRET KEY HERE THIS VALUE MUST BE PRIVATE...",
        
'response' => $_POST['reCAPTCHA_Token'],//Token devuelto por Google al Front End y enviado a este formulario
        
'remoteip' => $_SERVER['REMOTE_ADDR'//Direccion IP publica del cliente que envia el formulario
    
)
  );
  
$opts = array('http' =>
    array(
    
'method'  => 'POST',
    
'header'  => 'Content-type: application/x-www-form-urlencoded',
    
'content' => $post_data
    
)
  );
  
$context  stream_context_create($opts);
  
$response file_get_contents('https://www.google.com/recaptcha/api/siteverify'false$context);
  
$result json_decode($response);
  if(
$result->action != $_POST["action"]) {
    throw new 
Exception("Google recaptcha action missmatch");
  }
  if(
$result->score 0.5) {
    throw new 
Exception("Google recaptcha score too low");
  }
  
//Devuelta a las validaciones actuales de seguridad para los datos recibidos 
}catch(Exception $e) {
  
//catch exception here
}
?>


saludos!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

@XSStringManolo

Se ve chula la web. El color de la fuente con el fondo blanco es muy cómodo de leer.

Puede ser que falle el código si el visitante utiliza un proxy no transparente con una IP y en la cabecera forwarded la del cliente? Igual interesa comprobar si ambas coinciden, y de no ser así, comprobar si la ip es de un dominio relacionado con servicios de proxy, hosting o eso.


AlbertoBSD

#2
Cita de: @?0!,5^34 en 11 Diciembre 2019, 11:09 AM
Se ve chula la web. El color de la fuente con el fondo blanco es muy cómodo de leer.

Jajaja utilice la primera plantilla que me gusto solo le edapte el PHP en el backend


Cita de: @?0!,5^34 en 11 Diciembre 2019, 11:09 AM
Puede ser que falle el código si el visitante utiliza un proxy no transparente con una IP y en la cabecera forwarded la del cliente?

Si el proxy funciona como debe (Sock 4 Sock 5 ) la IP debe de coincidir ya que tnato tu backend como el de google verian la misma IP, aunque dependiendo del proxy podria tener ya un score bajo en google, ahorita lo compruebo y posteo los resultados.

Ya realize la prubea con el proxy no arrojo error de las IP y tampoco me arrojo un Score bajo, incluso utilizando un navegador en modo incognito. Creo que el score te lo va ir bajando si tratas de abusar del formulario.

Saludos!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

Leguim

¿Quéeeeeeeeeeeee? ¿Se puede usar reCAPTCHA para archivos AJAX? ¿O entendí todo mal xD?

Es decir, digamos que tengo un sistema de comentarios con AJAX ¿Puedo validar cada envió con reCAPTCHA?

Algo parecido a un "timeline"

[TEMA]
[FORMULARIO DE COMENTARIO]

[OTRO TEMA]
[OTRO FORMULARIO DE COMENTARIO]

[OTRO TEMA MÁS]
[OTRO FORMULARIO DE COMENTARIO MÁS]

Los diferentes formularios se agregan de forma dinámica "foreach" usando PHP

AlbertoBSD

#4
Si, de hecho se puede validar muchas cosas de cada pagina, solo que si un mismo cliente hace mucha peticiones de recaptcha puede que le bajen el score, sin embargo tengo entendido que google "apreden" cual es el uso "normal" que se le da a cada pagina.

En el primer post aparece como usarlo en el back end

En el link que publique, viene los codigos para implementarlo de manera generica aqui ahora pego el script:

Código (javascript) [Seleccionar]

   grecaptcha.ready(function() {
     grecaptcha.execute('SITE KEY HERE, THIS VALUE IS PUBLIC', {action: '/login'}).then(function(token) {
       $.ajax({
         type: "POST",
         url: "/path/to/form/backend/",
         data: {
           ...//mas datos
           action: "/login",
           reCAPTCHA_Token: token,
         },
         success: function( data, textStatus, jQxhr ){
           ...
         },
         error: function( jqXhr, textStatus, errorThrown ){
           ...
         }
       });
     });
   });


En teoria solo tendrias que modificar el action de cada llamada a grecaptcha.execute y el action que le mandas por ajax a tu sever, ya el servidor se tiene que validar que el action coincida tanto el que le mandas con ajax como el que responde google en el backend

podrias tener un action distinto para cada formulario distinto y validarlo del lado del server.

Saludos!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

Leguim

Interesante... yo uso la v2 ese que al darle click al captcha se verifica o te sale una tarea para completar. ¿Funcionara con este?

AlbertoBSD

La v3 es totalmente transparente, el usuario no tiene que darle click a nada.
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW