2011-03-17 9 views
8

Estoy construyendo un juego de navegador y estoy usando una gran cantidad de ajax en lugar de actualizaciones de página. Estoy usando php y javascript. Después de mucho trabajo noté que ajax no es exactamente seguro. Las amenazas que me preocupan es decir que alguien quiere buscar información de alguien en mi servidor SQL, solo necesitan ingresar la información correcta en mi archivo .php asociado con mis llamadas ajax. Estaba usando GET style ajax calls, lo cual era una mala idea. De todos modos, después de una gran cantidad de investigaciones, tengo las siguientes medidas de seguridad en su lugar. Cambié a POST (que no es realmente más seguro pero es un deterent menor). También he referido en su lugar, que una vez más se puede fingir, pero nuevamente es otro elemento de disuasión.Ajax Security (espero)

La medida final que tengo en el lugar y es el foco de esta pregunta, cuando mi sitio web está cargado tengo una clave hexadecimal de 80 caracteres generada y guardada en la sesión, y cuando envío la llamada ajax también estoy enviando el desafío clave en la forma de

challenge= <?php $_SESSION["challenge"]; ?> 

ahora cuando el archivo php ajax lea esto se comprueba para ver si el desafío enviado matchs el reto sesión. Ahora esto por sí solo no haría mucho porque simplemente puede abrir firebug y ver qué desafío se envía fácilmente. Entonces, lo que estoy haciendo es que una vez que se utiliza el desafío, genera uno nuevo en la sesión.

Así que mi pregunta es qué tan seguro es esto de donde se ve que solo se podía ver cuál era la clave de desafío después de que se envió y luego se renueva y no pudieron volver a verla hasta que se envió, por lo que no es posible para enviar una solicitud falsa de otra fuente. Entonces, ¿alguien ve un agujero en el bucle de este método de seguridad o tiene pensamientos o ideas adicionales?

Respuesta

1

Ver la respuesta por 'meagar'.

me gustaría mencionar:

pasando alrededor de un identificador en la sesión, que estás haciendo lo que la sesión ya está haciendo. Generalmente hay una cookie con un identificador único similar al que está generando, que le dice a su aplicación, esencialmente, quién es esa persona. Así es como funcionan las sesiones de PHP, en general.

Lo que tendría que hacer, en este caso, es comprobar que para una determinada solicitud - Publique o GET - que el usuario particular (cuyo único identificador de usuario, o similares, se almacena en la Sesión) tiene permiso para agregar/cambiar/eliminar/lo que sea con esa solicitud en particular.

Por lo tanto, para una solicitud de "búsqueda", solo devolverá los resultados que el usuario X tiene permiso para ver. De esta forma, no te preocupes por lo que envían: si el usuario no tiene permiso para hacer algo, el sistema sabe que no debe permitir que lo haga.

Por lo tanto, "debe estar autenticando todas las solicitudes".

Alguien puede agregar algo a esto.

+0

Esto suena exactamente como lo que quiero acometer, ¿podría darme alguna información sobre cómo autenticaría a alguien con este identificador único? – tye

+0

Si está trabajando en un juego, supongo que es posible que tenga usuarios y registro resueltos. Más allá de eso, estás buscando algo que comúnmente se conoce como "ACL". Básicamente, a los usuarios (o grupos de usuarios) se les otorgan conjuntos de permisos para lo que pueden hacer ("pueden agregar artilugios", "pueden editar * propios * artilugios", "no pueden eliminar widgets", etc.). Ese es un gran tema para otra pregunta, y probablemente ya se haya respondido/respondido bien. –

10

Tu definición de "seguro" es vaga. Pareces menos interesado en evitar que se intercepten datos, y más interesado en evitar que las personas envíen solicitudes personalizadas a tu servidor. Eso no es seguridad, es solo un buen diseño de la aplicación: su programa no debe aceptar solicitudes que provoquen la ruptura del estado interno. No hay absolutamente nada que pueda hacer para evitar que las personas envíen los datos que deseen. La solución es validar los datos que envían en el lado del servidor, no para tratar de evitar que envíen datos del lado del cliente, que siempre fallará.

me cambiaron a POST

Usted no debe molestarse; eso no tiene nada que ver con la seguridad. Use el verbo HTTP apropiado para la solicitud. ¿Estás consultando información? Use una solicitud de obtención. ¿Estás actualizando/insertando/eliminando información? Usa la publicación

que alguien desea consultar la información de alguien en mi servidor SQL que acababan hay que introducir información correcta a mi archivo .php asociado

Usted debe autenticar todas las solicitudes para asegurarse de que tener acceso a los datos que están consultando. SSL lo ayudará a realizar la autenticación de forma segura.

cuando mi sitio web está cargado tengo una llave hexagonal de 80 Char genera y se guarda en la sesión, y cuando im enviar la llamada ajax También estoy enviando el desafío clave

Esto no va ayudar. La premisa completa de su pregunta parece ser que el usuario tiene Firebug o una herramienta de depuración HTTP similar instalada. Si lo hacen, la clave de sesión se vuelve inútil.

+0

tal vez podría ayudar a aclarar algo para mí, ¿cómo podrían mis datos ser interceptados, y si tienen firebug, pueden simplemente mirar los datos de mi sesión? pensé que se había guardado el lado del servidor y no se podía ver. – tye

+0

datos pueden ser interceptados a través de la detección de paquetes en la red local –

+0

¿No sería muy difícil obtener algo en la red local? – tye

0
function mysqlRequest(type,server,name,value,sync){ 
    $.ajax({ 
      type: 'POST', 
     url: 'sql.php', 
     data: "server=s"+server+"&type="+type+"&name="+name+"&value="+value+"&challenge=<?php echo $_SESSION['challenge']; ?>", 
     cache: false, 
     dataType: 'json', 
     async: sync, 
     success: function(data){ 
      }, 
     complete: function(){} 
+0

¿Has probado esto? Inspeccione la página con Firebug, y encontrará el valor después de '" & challenge = 'nunca cambia, no importa cuántas veces cambie el valor de' $ _SESSION ['challenge'] 'server-side. Debe * manualmente * actualice el valor en función del resultado de la solicitud AJAX. No ocurre automáticamente. Esto implica que debe enviar la nueva clave en respuesta a la solicitud AJAX cada vez, lo que anula el objetivo de la clave. – meagar

+0

Como nota adicional, ¿Está enviando consultas SQL al servidor a través del parámetro 'value'? Esta es una idea terrible, terrible, imperdonablemente mala. Cualquiera puede escribir cualquier consulta SQL que desee y enviarla. Este es el malentendido fundamental aquí: la solución no es t para "asegurar" el envío de consultas SQL al servidor; la solución es * nunca * enviar consultas SQL. – meagar

+0

sí, esos son los cambios que estaba planeando hacer lol. y ok gracias por la información con respecto al hecho de que ese código no enviará la sesión actualizada va riable. Entonces, no creo que deba usar ajax para propósitos sql. Toda la base de este juego que estaba haciendo era eliminar la necesidad de refrescar páginas. Está yendo a un estilo MMO RTS. – tye