23 de agosto de 2012

Capas de seguridad

Terminé el mecanismo de seguridad para el sistema de promociones que me habían hackeado durante un concurso en el que el premio eran unas motocicletas. Supongo que tendré que cambiar el algoritmo de encripción (porque según leí, el md5 ya es un hash obsoleto), pero eso es lo de menos. Lo que pasa es que me pidieron que se volviera a implementar el sistema para otra promoción, y luego otra, y en la próxima que se estrenará el lunes necesitaremos mayor seguridad porque el premio es un viaje a Londres y no queremos que los usuarios se pasen de listos.

La evolución de la seguridad de mi sistemita fue así:
1. Si el sistema detecta que quieres votar otra vez por una foto con el mismo id de facebook, se niega a insertar el voto. A eso le dieron la vuelta nunca mandando el mismo id de facebook.
2. Si un voto viene desde la misma ip que otro voto para una misma foto, el sistema revisa primero que el voto anterior no haya sido hecho en menos de un minuto, y en segundo lugar que no se exceda el límite de 10 votos por ip. En cualquiera de los dos casos (voto desde una misma ip en menos de 60 segundos y más de 10 votos desde la misma ip), no permite la inserción del voto. A esto se le puede dar la vuelta usando proxys u otros mecanismos que hagan que siempre aparezca una ip distinta por cada voto.

Y ahora sí, mi nuevo esquincle del que me siento más o menos orgullosón.

3. Al momento de cargar la página, el sistema tras bambalinas genera una cadena encriptada usando varios datos (fecha, hora, id de la foto, id del usuario de facebook, etcétera), y entonces, ya que tiene ese hash: a) lo inserta en una tabla en la base de datos, y b) lo manda escondido en la página recién cargada para que se use como uno de los parámetros del voto. Cuando el usuario vota manda también ese hash encriptado, y entonces el sistema hace dos cosas: I. revisa que en efecto esté en la base de datos; es decir, que esa encripción haya sido creada en primer lugar por el programa mismo; y II. revisa que el hash no se haya usado previamente para votar por esa foto. Si en la primera parte no encuentra la cadena en la tabla de hashes, no permite el voto, pero si sí la encuentra, entonces revisa la tabla de votos para ver si dicha cadena aún no se ha usado, si aún no ha sido usada el sistema permite el voto, pero si ya se usó no lo permite.

Es decir, todavía podrían darle la vuelta al mecanismo, e.g. refrescando 100 veces la página y guardando todos los hashes legítimos, para luego usarlos... Pero la cosa es que ya sería más lento y difícil de hackear. Por otro lado, como registro el momento en que se genera el hash, y del mismo modo el momento en que se hace el voto, estoy seguro de que podría ver mucho más fácil las inconsistencias.

No hay comentarios.: