¿Qué tan manipulables son las encuestas de los diarios online? Hoy se me ocurrió esta pregunta y en el primer diario en que probé (La Nación) resultó ser una tarea bastante simple. Voy a explicar primero cómo es el proceso de votación en una encuesta del diario, los problemas que encontré y una prueba de concepto.
Proceso de votación
Antes de votar, tenemos que ingresar un captcha:

Luego del voto el servidor nos envía una cookie que se usa cuando queremos votar de nuevo, para detectar si ya votamos anteriormente:

Con estos dos métodos, captcha y cookie, evitan (o lo intentan) la automatización de los votos y la múltiple votación manual.
Automatizando el voto
Cookies
Lo primero que se nos ocurre es borrar esa cookie y reintentar votar. Y funciona perfectamente, ya podemos votar N veces manualmente.
CAPTCHA
Lo que queda para poder automatizar el proceso de votado es encontrarle algún bug a la implementación que usan para el captcha. Y lo tiene. El principal problema es que reutilizan las imagenes. Es decir, pre-generaron imágenes para varios caracteres y usan los mismos archivos para todos los captcha.
Entonces, el problema de “crackear” (?!) el captcha se reduce de reconocer texto de una imagen (tarea que puede ser muy compleja) a tener una tabla que relacione una imagen con un caracter. En la prueba de concepto explico cómo hacerlo.
Velocidad
No hacen (parece) ningún bloqueo a una IP si esta realiza muchos votos en un período corto de tiempo. En la prueba de concepto hice los pedidos cada dos segundos sin ningún problema.
Prueba de concepto
La encuesta que usé de ejemplo es la de la nota Dios, ¿no existe?. Cuando ví la nota, la encuesta tenía estos resultados:

Si: 48,99%, No: 47,13%, NS/NC:3,88%
Despues de terminar de correr el script, unas horas más tarde, los resultados eran:

Si: 21,68%, No: 76,49%, NS/NC: 1,83%
Un claro ejemplo de como la tecnología mató a Dios!
No voy a dar el código del script pero si explicar lo que hace. Los problemas que enumeré antes los resolví de la siguiente manera:
Cookies
El script de votación no almacena las cookies enviadas por el servidor. Listo, siguiente punto.
CAPTCHA
Como había dicho antes, al reutilizar las imágenes para el captcha, sólo hay que tener una lista que haga la correspondencia imagen -> caracter. Esta lista la fui creando de la siguiente manera:
En cada votación, el script se descarga las imágenes que componen el captcha y por cada una de ellas:
- Calcula el md5 del contenido de la imagen.
- Si el md5 no es conocido, guarda la imagen a disco y termina su ejecución.
- Para las imágenes no conocidas, manualmente veo la imagen y agrego a la lista la dupla <md5, caracter>.
Después de un par de corridas tengo todos los caracteres que usan en la lista y el script puede correr sin intervención humana.
Velocidad
Inicialmente hacía una pausa de 1 minuto entre cada voto porque pensé que me iban a bloquear por tantos votos desde una misma IP. Pero fui achicando la pausa hasta dejarlo en dos segundos sin que hubiera ningún bloqueo.
Recomendaciones
Como pude encontrar un método para manipularle las encuestas me las doy de experto y listo una serie de mejoras que deberían hacerle al sitio para evitar estas manipulaciones:
- Reemplazar su solución casera de captcha por algún servicio diseñado por expertos, como reCAPTCHA.
- Agregar algún filtro para no contar los votos de cierta IP cuando se detecta una alta cantidad de votos en un período corto de tiempo (esto hay que ver cuidadosamente como hacerlo porque puede traer problemas a todos los usuarios que salen por una misma IP (por ej, saliendo por un proxy).
- No aumentar los contadores de las opciones inmediatamente por cada voto. Si alguien está intentando manipular la encuesta le resulta más simple correr su script, refrescar la página y ver si aumentaron los contadores. Deberían almacenar los votos en algún lado y cada cierto tiempo correr un proceso que determine si el voto es valido o no, sumarice y eso es lo que se muestra como totales.
Como punto a favor, vi que cada votación tiene en el formulario un id_voto así que es probable que almacenen no solo el total de votos sino también cada voto, con lo que después se les facilita hacer algún control post-mortem para detectar si hubo manipulación de la encuesta.
ACTUALIZACIÓN: googleando un poco, parece que hay varias quejas sobre manipulación de encuestas en La Nacion (hay noticias de esto desde el 2008). Ya deben saber hace rato que tienen estos problemas (Teoria conspirativa Nro 42: Saben de estos problemas y lo dejan sin resolver, para que cuando alguien les cambie los resultados, puedan sacar otra noticia sobre la manipulacion de la encuesta, logrando mas trafico (¿paranoico yo?, noo)).
ACTUALIZACIÓN: 2011-05-23. Me avisa hoy @hechomigas que reemplazaron el captcha casero por reCaptcha.
Categorías: Investigacion

Que tal Ktulu?
Siempre visito el blog, pero no acostumbro a fimar.
Esta vez me tomo un momento para hacerlo por que el laburo que hiciste en este post es impecable.
Te dejo mis saludos y felicitaciones!
Muchas gracias!
Hereje!!!! Fomentando la eterna lucha de Religion Vs Ciencia!!
Probaste mandar datos con id_votos viejos? Override de datos!
´ta madre!! y yo que pense que se habia confirmado que Dios no existia!! Excelente laburo, Lucho!!!
@Pepe No se me ocurrió probar eso..
@Ramiro gracias!
Te cuento que acaban de hablar sobre la encuesta de dios en la nacion y de como se pueden manipular las encuentas!!! Todo en Cual es? (Rock and Pop)
Salutes luigi y felicitaciones jejeje
naaa, en serio? buenisimo. Y no pasaron el link? que garcas! jaja
groso ktulu!!!
hola , me podrias decir en que lenguaje hiciste el script?
@Will: Ruby
OYE PORQUE NO PUBLICAS EL SCRIPT HIJO DE RE MIL PUTAS, OSEA QUE CREASTE ESTE POST PARA PRESUMIR TROLASO Y LA RECONCHA DE LA LORA
Querido cobarde-anónimo:
El post no es para presumir, sino para darnos cuenta de lo fácil que es manipular estos datos y que nadie debería tomar los resultados de estas encuestas como la “opinión de la gente” (o al menos la opinión de los usuarios del sitio con esa encuesta).
El script no lo publiqué porque no aporta nada al objetivo del post. Cualquiera que sepa programar, con la información del post es suficiente para que pueda hacer su propio script en un rato. Esta no-publicación sirve también como una barrera de entrada, previniendo que cualquier boludo pueda hacerlo.
Para próximos comentarios, por favor mejora tu ortografía: “osea” es “o sea”, a menos que estes hablando sobre algo relacionado con huesos, en cuyo caso es válido usar “ósea”. Y “trolaso” va con z.
QUiero conseguir este Srcipts de votación. Me pueden enviar el codigo ?
@Ernesto: Leiste algo del post? El último update dice que cambiaron el captcha y lo que expliqué ya no funciona y por otro lado, si hubieras leido el comentario anterior al tuyo tenés la explicación de porque no te paso el script.
https://joindiaspora.com/posts/1339545