Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Seguridad en ranking online propio

Iniciado por mi-go, 18 de Marzo de 2010, 10:24:42 AM

« anterior - próximo »

mi-go

Buenas!

Estoy pensando la mejor manera de crear un sistema de ranking online propio y tengo dudas con la seguridad...

Pensaba hacer un web service para controlar el ranking online porque es lo que me parece más reutilizable. Primero pensé en hacerlo en PHP, pero viendo el tema de la seguridad, para asegurarme de que sólo lo puede llamar el juego y no otra aplicación y que además los datos que se envían no se puedan leer para poder reenviarlos después, encontré que existe un estándar en seguridad de web services que se llama WS-Security que te da todas esas posibilidades.

En la parte sevidor de PHP tengo que pasar, porque WS-Security sólo lo he visto implementado con una extensión que no es sencilla de instalar y en servidores compartidos no la van a meter... así que tiraré por ASP.NET que sí soporta nativamente WS-Security, aunque hay que hacer algunas cosillas.

El problema lo veo ahora en la parte cliente del juego en AS3. Según he leído flex (porque realmente uso el sdk de flex) no soporta nativamente WS-Security pero hay apaños por ahí para crear una cabezera que te da la autentificación necesaria en WS-Security, pero que sólo sirve para eso y no se puede activar la parte de encriptación de los mensajes.

¿Alguien sabe algo de esto o a implementado un ranking online con seguridad de otra forma?

Gracias!!!
Web personal: www.javiermairena.net
The Game Kitchen: www.thegamekitchen.com
AccessAble Games: www.accessablegames.com
Blog Videojuegos Accesibles: www.videojuegosaccesibles.es

fjfnaranjo

No te obsesiones con WS-Security. Para algo como lo que comentas quizás es matar moscas a cañonazos.

¿No has visto alguna otra solución que funcione como una librería de PHP y que puedas incluir directamente en los sources del proyecto?
fjfnaranjo.com - Creating entertainment - Creando entretenimiento
fjfnaranjo [4t] gm4il [d0t] c0m (mail y msn)

mi-go

Sí, está también la solución de hacer un web service en php utilizando web service helper: http://www.jool.nl/jool-tech-zone/webservice-helper/
Son sólo unas clases en php para facilitar el uso de ws en php, ya que php5 soporta SOAP pero no tienen hecho un metodo fácil para hacer ws. Eso no requiere ningún tipo de instalación rara en el servidor, sólo desplegar una clases en tus directorios y ya está.

Lo malo es que eso no es nada seguro. Porque cualquiera puede llamar al servicio web y mandar un .maxscore("usid", "10000000");
Se me ocurrió encriptar las llamadas en una sola cadena y concatenado con una clave, así es imposible que te manden otra puntuación distinta, pero sí que pueden volver a hacer la misma llamada de nuevo. En un sistema básico con una simple tabla de puntuaciones máximas da igual que envíe de nuevo su puntuación, pero en cualquier otro sistema que tenga algún tipo de moficación o baja ya sería un problema muy grave que alguien pudiera repetir una llamada en otro momento.

Web personal: www.javiermairena.net
The Game Kitchen: www.thegamekitchen.com
AccessAble Games: www.accessablegames.com
Blog Videojuegos Accesibles: www.videojuegosaccesibles.es

fjfnaranjo

¿Y si cifras el mensaje con una clave simétrica pública que sólo puedas descifrar con la privada del server?
fjfnaranjo.com - Creating entertainment - Creando entretenimiento
fjfnaranjo [4t] gm4il [d0t] c0m (mail y msn)

mi-go

#4
De esa manera no puedes descifrar el mensaje, pero sí puedes volver a hacer la misma llamada otra vez, en otro momento. Aunque no la puedas modificar.
Web personal: www.javiermairena.net
The Game Kitchen: www.thegamekitchen.com
AccessAble Games: www.accessablegames.com
Blog Videojuegos Accesibles: www.videojuegosaccesibles.es

tamat

#5
pero puedes usarla para validar si el mensaje viene de tu aplicacion, es decir, envias tu "codigo de autenticidad" y luego los datos que quieres pasar al server sin cifrar (o con un cifrado cutrillo), y listos.

el server comprueba que el codigo sea correcto y entonces aplica los cambios.

una manera sencilla es hacer que el server envie un codigo, el cliente coge el codigo aleatorio, el cliente lo pasa a MD5 usando una clave privada y le envia el resultado al server, el server hace lo mismo usando la misma clave. Si ambas coinciden entonces sabe que el usuario es valido y acepta sus peticiones.
Por un stratos menos tenso

t-spy

Yo haría una petición doble. Me explico:

El cliente hace una petición al servidor con un código identificador.
El servidor responde con un código identificador diferente.
El cliente envía una segunda petición en la que junto a la puntuación se incluye el código enviado por el servidor.
El servidor valida el mensaje comprobando que el código que recibe es el que ha enviado antes y actualiza la tabla de puntuaciones.

Por supuesto, todos los mensajes entre cliente y servidor estarían cifrados.

Para incrementar la seguridad, además de la puntuación en el servidor se podría guardar tanto el código identificador inicial como el identificador enviado como respuesta. Una comprobación rápida permitiría averiguar si alguien está intentando enviar un código ya usado o uno inexistente.


mi-go

Gracias!

Voy a buscar un poco más a ver si por ahí existe alguna otra solución medio estandar que no sea WS-Security, pero si no... voy a tener que usar alguna solución como la que planteais.
Web personal: www.javiermairena.net
The Game Kitchen: www.thegamekitchen.com
AccessAble Games: www.accessablegames.com
Blog Videojuegos Accesibles: www.videojuegosaccesibles.es

Buffon

Yo haría algo parecido a t-spy.

Cuando el cliente:

Inicia el juego -> newGame():return int identification
Acaba el juego -> endGame(identification)
Actualiza puntuaciones -> updateHighScores(score,identification)

El cliente tiene q configurar el juego para si recibe un evento que se cierra la ventana haga un endGame, además de tenerlo configurado para cuando el cliente decide empezar un juego nuevo a mitad, siempre un endGame -> startGame.

tú en el server tendrás una BBDD tal que:

Peticiones [ ID UNIQUE, IPORIGEN, TIMETOLIVE, ...]

Cuando se hace un newGame tú haces un INSERT INTO PETICIONES (ID,IPORIGEN,TIMETOLIVE,...) VALUES (RANDOM(),...,...,..)

Cuando se hace un updateHighScores primero miras si existe en la BBDD ese id, si existe actualizas tu highscores y lo eliminas de la tabla, si no existe devuelves error y tan contentos.

al hacer un endGame(id) siempre eliminas el id, como lo tendrás con try - catch si te devuelve un error no te importa.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.