Captcha de coinhive en PHP: alternativa a recaptcha

Introducción

Actualización marzo del 2019: coinhive ha dejado de funcionar o dejará de funcionar al momento de escribir este post; por lo tanto este captcha ya no es válido.

Nota: si quieres usar reCAPTCHA en PHP mira mi otro post. Sé que este post es sobre una alternativa a reCAPTCHA pero como puedes ver, ya no funciona.

Sordid details following…

Un captcha funciona principalmente para detener a los bots y dejar pasar a los humanos. Veamos cómo trabajar con el captcha de coinhive en PHP.

El captcha de coinhive es un captcha como el recaptcha de Google, pero éste funciona minando criptomonedas. Así, no medimos si se trata de una persona o de un bot, sino del poder computacional.

Gracias a esto, a los “spammers” no les funcionará programar bots, pues aunque el captcha no ofrece retos para los bots, hace que la computadora tenga que trabajar. De esta forma los bots tendrán que esperar bastante tiempo antes de hacer lo que iban a hacer.

Cómo implementar captcha de coinhive en PHP

Esto es muy sencillo. Lo que tenemos que hacer es poner el captcha dentro de un formulario. Cuando el captcha detecta que has resuelto los hashes correspondientes, inyecta un nuevo campo al formulario, el cual tiene un token.

Del lado del servidor comprobamos el token con la API de coinhive, y si ambos coinciden entonces significa que el captcha ha sido resuelto correctamente.

Lado del cliente

Comencemos programando el lado del cliente para trabajar con el captcha de coinhive en PHP.

Pongamos de ejemplo este formulario en donde simplemente pedimos un nombre:

Ahora, para integrar el captcha ponemos dentro de él la carga del script y el siguiente div:

Expliquemos los atributos:

  • data-disable-elements: un selector css. Todos los elementos que cumplan esa regla serán deshabilitados hasta que los hashes sean completados. Es opcional y sólo ayuda visualmente
  • data-whitelabel: ocultar el logotipo y otras cosas de coinhive
  • class: bueno, esto es una clase. Pero no debemos removerla, me parece que el script toma esa clase como guía para saber en dónde inyectar el captcha
  • data-hashes: cuántos hashes se deben calcular antes de que el captcha sea resuelto. Debe ser un múltiplo de 256. Este valor lo ponemos aquí y también del lado del servidor
  • data-key: nuestra clave pública que obtenemos en el escritorio de coinhive

La lista completa así como la guía la podemos ver en: https://coinhive.com/documentation/captcha

Es importante notar que si el usuario tiene un bloqueador de publicidad el script no se cargará, y por lo tanto no será posible resolver el captcha.

De tal manera que nuestro formulario completo lucirá así (por favor ignorar los estilos por ahora, pues el objetivo del post no es ese):

Veamos ahora el lado del servidor.

Lado del servidor

Sigamos ahora con el lado del servidor para trabajar con el captcha de coinhive en PHP.

En el lado del servidor recibiremos el nombre y el token. Como lo dije, se enviará por el método post y podremos acceder a él a través de $_POST["coinhive-captcha-token"].

El código de ejemplo queda así:

Lo que hacemos es hacer una petición post con stream_context_create. Le pasamos nuestra clave privada (no la pública, ya que la pública va en el formulario), los hashes que pusimos del lado del cliente para evitar trampas y también el token que debió ser generado por el captcha.

De ahí coinhive se encarga de realizar la validación y dependiendo de ello nosotros realizamos acciones.

Obviamente este es un ejemplo básico, no hay validaciones ni estilos, pero muestra lo más importante de cómo trabajar con este servicio que algunos llaman malware aunque no lo es 😉

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

8 comentarios en “Captcha de coinhive en PHP: alternativa a recaptcha”

  1. Pingback: WebAssembly: definición, usos, ventajas y desventajas - Parzibyte's blog

    1. El resultado es el mismo, incluso con cero, tarda menos , pero tarda mucho todavía y corro el riesgo de que el usuario se desespere y se vaya.

    2. Tienes razón, el usuario puede abandonar la página. Recuerda que únicamente es una alternativa, de ahí puedes seguir usando recaptcha. Por otro lado, te digo de nuevo que depende de la computadora del usuario, prueba en otra PC y verás.

    3. Gracias, hice la prueba en otra computadora con mayor capacidad y ahora tardó unos 30 segundos contra como 5 minutos en la anterior, veo que esto no es viable para equipos con pocas prestaciones, seguiré con recaptcha mejor, saludos.

    4. Sí, te digo que depende mucho de la computadora. En mi caso la mía (y no es nada potente, sirve para lo básico) tarda como 32 segundos para calcular 1024 hashes.

  2. Pingback: API para acortar enlaces con Coinhive en PHP - Parzibyte's blog

Dejar un comentario