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.

Relacionado:  Pasar variable de PHP a JavaScript

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.

Relacionado:  PHP: Habilitar extensión de Postgres PDO en Windows

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 😉

Puedes probar el ejemplo aquí. Y descargar el código fuente aquí.


Estoy disponible para trabajar en tu proyecto o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.
Si el post fue de tu agrado muestra tu apoyo compartiéndolo, suscribiéndote al blog, siguiéndome o realizando una donación.

Suscribir por correo

Ingresa tu correo y recibirás mis últimas entradas sobre programación, open source, bases de datos y todo lo relacionado con informática

Únete a otros 707 suscriptores


parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

8 Comments

Manuel Mar · noviembre 20, 2018 a las 10:09 pm

tu idea es buena, pero tu demo toma mil años minar los 1024 hash, no hay algo mas rapido?, gracias.

    parzibyte · noviembre 20, 2018 a las 11:08 pm

    Hola. Justamente el propósito de este captcha es que sea tardado; prueba minando 256 hashes a ver qué tal; recuerda que todo depende de la máquina.

    Manuel Mar · noviembre 21, 2018 a las 12:11 am

    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.

    parzibyte · noviembre 21, 2018 a las 12:21 pm

    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.

    Manuel · noviembre 21, 2018 a las 3:10 pm

    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.

    parzibyte · noviembre 21, 2018 a las 4:11 pm

    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.

WebAssembly: definición, usos, ventajas y desventajas - Parzibyte's blog · mayo 27, 2019 a las 8:53 pm

[…] minador de criptomonedas en la web llamado coinhive (que ya no está disponible, que en paz descanse) utilizaba WebAssembly para minar la criptomoneda […]

API para acortar enlaces con Coinhive en PHP - Parzibyte's blog · agosto 31, 2018 a las 11:56 am

[…] aparte de proveer un captcha, nos brinda una función para acortar enlaces y ganar dinero por ello. No voy a entrar en detalles […]

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

A %d blogueros les gusta esto: