Supongamos un concurso en el que se realiza una votación en la Web. Supongamos por ejemplo uno llamado Las mejores webs de la Región de Murcia, organizado por un periódico y con la colaboración de un montón de entidades importantes. Supongamos que tenemos cierto interés en que gane una de las webs participantes. Supongamos además las siguientes condiciones:
- Para votar es necesario estar registrado.
- Para registrarse hay que cumplimentar un formulario como el siguiente:

- Para validar el registro se envía un correo al e-mail indicado, en el que se indica un link para confirmar el registro.
- Sólo se puede emitir un voto por usuario registrado al día.
- (Bonus) Supongamos, por último, que además sólo se puede emitir un voto por dirección IP al día.
Para ganar el concurso es necesario votar masivamente (suponiendo un concurso concurrido) por lo que es necesario automatizar el proceso de votación, para lo que es necesario realizar un par de cientos de registros de usuarios con los que votaremos. Vayamos por partes.
1. Automatización del proceso de registro para hacernos con una base de usuarios grande con los que poder votar.
Teniendo en cuenta el proceso de registro de usuarios descrito, surgen a primera vista un par de problemas para poder automatizar el proceso (ordenados según complejidad):
- Leer el código de la imagen, cuyo fin es precisamente evitar lo que nos proponemos: el fraude.
- Proporcionar cientos de e-mails válidos, y validar la dirección como propia.
De nuevo, vayamos por partes.
1.1 Automatizar la lectura del código de la imagen.
Las imágenes con códigos o captchas están pensadas para ser difíciles de leer por parte de programas, no así por personas. La mayoría lo son, pero otras, como la del formulario de arriba, sólo requieren un poco de tiempo para hacer un programa que las lea. A mí, que me va eso de perder el tiempo en tonterías, no me costó mucho hacer un programa que las lee con un 100% de acierto. Os explico como:
- Lo primero es observar cómo son estas imágenes y qué características tienen. En la siguiente dirección aparece una nueva imagen cada vez que accedemos: http://premiosweb.laverdad.es/backend/captcha.php.
- Vemos que el código que aparece en las imágenes es un código hexadecimal de 7 caracteres, es decir, que combina los caracteres 0, 1, ,2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e y f.
- La tipografía es conocida: la tipografía Sans.
- Vemos también que en las imágenes aparecen unas líneas finas aleatorias, que no suponen mayor problema.
Teniendo en cuenta lo anterior, podríamos pensar en complejos filtros de imágenes y complejos algoritmos, pero nada de eso. Veamos cómo proceder con la siguiente imagen de ejemplo:
Lo primero que hemos de hacer es pasar la imagen a blanco y negro. Para ello podemos usar cualquier librería de manipulación de imágenes. La imagen quedaría de la siguiente tal que así:

Lo primero que hemos de hacer es pasar la imagen a blanco y negro. Para ello podemos usar cualquier librería de manipulación de imágenes. La imagen quedaría de la siguiente tal que así:
Con un pequeño filtro de contraste podríamos eliminar las líneas finas; pero pasamos, no es necesario.
La forma de proceder a continuación es bastante simple; generamos las siguientes imágenes con el mismo tamaño, misma tipografía y posición de las letras que la anterior (no problemo, son siempre las mismas):
Si medimos la distancia de las imágenes anteriores con la del ejemplo, la más cercana será la rodeada en rojo. Pero, ¿cómo medir esa distancia? Sencillo: el número de pixels diferentes entre cada una de las imágenes anteriores y la imagen del ejemplo. Este número siempre será menor comparando la imagen del ejemplo con una que contenga un subconjunto del código contenido en esta que con cualquier otra imagen.
Si medimos la distancia de las imágenes anteriores con la del ejemplo, la más cercana será la rodeada en rojo. Pero, ¿cómo medir esa distancia? Sencillo: el número de pixels diferentes entre cada una de las imágenes anteriores y la imagen del ejemplo. Este número siempre será menor comparando la imagen del ejemplo con una que contenga un subconjunto del código contenido en esta que con cualquier otra imagen.A continuación, una vez sabemos que el primer carácter del código es el 2, generamos las imágenes con los códigos 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 2a, 2b, 2c, 2d, 2e y 2f. De nuevo, la más cercana será la que contiene un subconjunto del código de la imagen del ejemplo, es decir, la que contiene el código 29. Procediendo 7 veces de la forma anterior llegamos al código contenido en la imagen. Vamos, el que queríamos leer. Para ello hemos tenido que generar 16 * 7 = 112 imágenes, aunque con una pequeña caché (es decir, no borrando las imágenes generadas), basta con generar aproximadamente la mitad cada vez. Esto hace que el proceso de leer el código de una imagen tarde no más de un par de segundos.
¡Ala! Todo este proceso el programable facilmente (si a alguien le interesa le paso el programa). Así que problema 1 solucionado: la lectura del código de las imágenes.
1.2 Proporcionar cientos de e-mails válidos, y validar la dirección como propia.
Esto sería un problema, si no fuera porque el que diseñó el proceso de registro hizo que la dirección de validación del registro de un e-mail fuera predecible a partir del propio e-mail, con lo que podemos inventarnos sin problema las direcciones de correo electrónico. En este caso, si nos registramos con el e-mail pedo@caca.es la dirección de validación será http://premiosweb.laverdad.es/confirmacion/pedo@caca.es.html.
Generar direcciones falsas, nombres falsos y teléfonos falsos no supone ningún problema. Incluso ya hay por ahí programas que te generan datos personales aleatorios.
Para automatizar el proceso de registro hemos de hacer un programa que interactúe con la web, utilizando librerías como CURL. De la misma forma automatizamos el proceso de votación con la base de datos de usuarios que nos hemos creado en el proceso de registro.
2. Votar desde diferentes direcciones IP.
Para ello utilizamos servidores proxy para navegación anónima disponibles a lo largo y ancho de Internet. Para localizar servidores proxy basta con buscar un poco en Google. CURL permite la navegación a través de proxies sin problema.
Conclusiones.
Si promocionas un concurso a través de la Web te vendrán bien los siguientes consejos:
- Diseña unos captchas más complejos.
- Haz que las direcciones de validación del registro no sean obvias. Curratelo un poco anda.
Lástima que no pasara mi web a la fase final :(
Nota: Todo esto describe como hacer trampa y no creo que la legislación actual esté muy de acuerdo con eso de hacer trampas. Así que si usas esta información hazlo bajo tu entera responsabilidad y ateniéndote a las consecuencias.