2010-07-23 24 views
8

Estoy usando jQuery en una aplicación que registra los clics del usuario para realizar una acción determinada mediante el enlace .click(), y quiero que esta funcionalidad esté disponible solo mediante un mouse del usuario. Uno de mis amigos señaló hoy que es posible ejecutar $ (elemento) .click() desde un terminal de javascript en Firebug (o algo similar), y lograr la misma funcionalidad que hacer clic en el elemento, algo que me gustaría evitar. ¿Alguna idea sobre cómo hacer esto? Gracias por tu contribución.Proteger la función jQuery del acceso externo

+0

Es preocupante que piense que esto podría ser posible. Deberías leer más sobre la seguridad y el proceso de explotación. (¿y te di un +1) – rook

+0

¿Alguna lectura recomendada? ¡Gracias! – man1

Respuesta

10

Respuesta corta: No, realmente no puedes evitarlo.

Respuesta larga: Cualquier evento como un click event está obligado a tales llamados Event handlers. Esos manejadores son functions que se ejecutan cuando ocurre un evento dado. Por lo tanto, si hace clic en un elemento, su navegador verifica si alguno event handlers está vinculado a él, en caso afirmativo, fires. De lo contrario, el navegador intentará bubble up el evento al parent elements, nuevamente verifica si hay algún event handlers vinculado a ese tipo de evento ... y así sucesivamente.

jQuerys.trigger() método (que es lo que realmente llama si llama al .click() por ejemplo) simplemente hace lo mismo. Llama al event handlers que están vinculados a un elemento específico, para un evento específico.

EDITAR

Es posible que algunas formas sencillas para comprarme una clase de soft detect un verdadero clic, por ejemplo, usted podría comprobar la propiedad toElement dentro de un event object. Esa propiedad no está configurada cuando triggered. Pero, de nuevo, puede falsificarlo fácilmente con .trigger(). Ejemplo:

$(document).ready(function() { 
    $('#invalid2').bind('click', function(e){ 
     alert('click\nevent.target: ' + e.toElement.id); 
     console.log(e); 
    }); 

    $('#invalid1').bind('click', function(){ 
     $('#invalid2').trigger({ 
      type: 'click', 
      toElement: {id: 'Fake'} 
     }); 
    }); 
});​ 

Ejemplo de trabajo: http://www.jsfiddle.net/v4wkv/1/

Si usted acaba de llamar $('#invalid2').trigger('click') la propiedad toElement no estaría allí y por lo tanto fallar. Pero como puede ver, puede agregar algo al event object.

+1

+1 muy buena respuesta, y estoy completamente de acuerdo. – rook

+0

Tiene sentido. Al menos puedo usar tu técnica para "inválido2" en tu ejemplo para que sea un poco más difícil de burlar. Muchas gracias por la gran respuesta. – man1

1

¿Qué estás tratando de evitar? ¿Alguien está jugando con tu script del lado del cliente? Puedes hacer cosas como ofuscar tu código pero no mucho más que eso. Pero incluso hacer esto es hacer que sea más complicado de lo que vale en mi opinión.

Si no desea que las personas que realizan ciertas cosas muevan la funcionalidad al servidor.

Siento ser portador de malas noticias.

+1

La ofuscación parece ser una manera terrible de evitar que su usuario se meta con su propia javascript. Si alguien realmente quiere pasar por todo el trabajo de hacer que algo funcione, ¿por qué no dejarlo? – LandonSchropp

+0

@helixed Estoy de acuerdo. Dije que no valía la pena pero es una opción. Le dije que lo moviera al servidor. – spinon

+0

Buen punto de compañeros, pero mi preocupación no es que alguien * pueda * llamarlo ellos mismos, sino que podrían escribirlo en algo que podría ejecutarse con mucha frecuencia. Necesito que el evento solo suceda con la frecuencia con que un humano hace clic en un mouse. (y sí, se comunica con mi servidor en cada llamada.) – man1

1

No se puede hacer nada en contra de eso, también sería posible escribir la función completa y luego dispararla.

¿Pero por qué es esto un problema? Si alguien está cambiando algo del lado del cliente, solo lo afecta. ¿O estás tratando de verificar algunos datos? Esto DEBE hacerse siempre en el back-end, porque nunca se puede estar seguro de lo que realmente se le envía.

0

Puede verificar el objeto de evento (que se pasa como primer argumento al controlador) originalEvent. No se definirá si el evento es simulado por.click()

Pero es completamente inútil. No puede usar javascript para seguridad: el cliente tiene control total sobre él (y Firebug Console es la herramienta más obvia). Las comprobaciones de seguridad del lado del cliente deben ser solo una sugerencia para el usuario y protección contra errores, las entradas maliciosas pueden detenerse solo en el lado del servidor.

Cuestiones relacionadas