it-swarm-es.com

¿Cómo puedo evitar que un usuario avanzado llame a mis funciones ajax?

Tengo un sitio que utiliza llamadas ajax para realizar una serie de funciones. Tienen la llamada del navegador web a un script: ajax.php. Aunque uso datos de publicación para transmitir los datos y limitar los comandos a los que puede llamar el script ajax, realmente no hay nada que impida a los usuarios falsificar las llamadas ajax para intentar manipular el sitio. ¿Hay alguna forma general de evitar que los usuarios falsifiquen las llamadas? ¿Hay alguna manera de garantizar que una llamada ajax en realidad provenga de mi sitio web y no de algún otro script o sitio?

¿O simplemente tengo que verificar las condiciones de contorno en el script php y evitar que los usuarios falsifiquen cosas que no se les permitiría hacer, sino permitirles falsificar donde se les permitiría?.

12
Daniel Bingham

No creo que haya ninguna manera de hacer esto de manera confiable, ya que cualquier información que pueda enviar podría ser falsificada, dependiendo de lo inteligente que sea el usuario.

Si solo desea un bloque simple de personas que no llaman desde su página, puede verificar el referente, usar una cookie o agregar un campo oculto aleatorio enviado por la página de llamada que caduca después de un cierto tiempo. Pero estos son fáciles de falsificar si el usuario está realmente decidido.

12
delete

En resumen, no. Cualquier solicitud hecha a una URL a través de GET o POST puede ser hecha por cualquier persona que use cualquier software. En realidad, una solicitud AJAX no es realmente diferente de cargar la URL directamente, excepto que con esta última los datos devueltos se muestran en el navegador como una página web.

Esta es exactamente la razón por la que siempre debe validar los datos enviados en el servidor, ya sea que haga o no una validación de Javascript.

No está claro exactamente qué está haciendo el script del lado del servidor y qué podría salir mal, pero si los usuarios pueden "manipular el sitio" llamando a su script con datos incorrectos, entonces lo están haciendo mal.

Probablemente la mejor solución será introducir alguna forma de autenticación.

6
DisgruntledGoat

Entonces, ¿básicamente desea limitar ajax.php para que solo responda a AJAX solicitudes?

No soy un experto en php, pero parece que es posible determinar si una solicitud determinada proviene de AJAX o una solicitud de navegador "normal" al verificar el valor de $_SERVER['HTTP_X_REQUESTED_WITH'].

Fuente

3
theycallmemorty

Como alguien más señaló ... las llamadas ajax son solo receptores de $ _GET o $ _POST, por lo que mi enfoque siempre ha sido tratarlos como lo haría con cualquier página de acción y filtrar/desinfectar la entrada. Si tiene una pequeña variación de lo que espera como un mes, por ejemplo, y sabe que siempre está en formato "enero, febrero, marzo ...", puede establecer una matriz de los valores esperados y filtrarlos. Atrapa cualquier cosa que no coincida y opcionalmente arroja algo como "Bzzt ... gracias por jugar ..."

No puedo pensar en un ejemplo en el que mi script Ajax deba ser más seguro que el envío de un formulario.

HTH

1
digit1001

Creo que una parte importante de su solución será limitación de velocidad tráfico de una huella digital específica del usuario. Tal vez un hash de dirección IP, cadena de agente de usuario y los datos que se envían.

Además, puede ser útil vincular la página que llama a ajax con los datos devueltos de ajax más cercanos. Entonces, en la página en cuestión, al cargar la página, envíe una clave de sesión que sea buena para X sesiones, para cada solicitud de ajax, su JavaScript necesitará devolver esa clave o el ajax devolverá un error. Una vez que su página llegue a X+1 llamadas ajax, obligue al usuario a realizar alguna acción (tal vez captcha? Tal vez incluso algo como un evento mousemove o tap dependiendo de la UA) antes de enviar una nueva sesión Baje el cable (fuera de banda del ajax original) y luego reinicie el proceso.

Aunque, al pensarlo, es posible que tal vez parte de su problema sea la validación laxa de los parámetros enviados. Si las personas solo pueden jugar con los parámetros enviados y recuperar datos válidos, entonces será más difícil hacerlo. Cómo hacerlo depende del tipo de valores que envía el cliente y de qué tipo de travesuras puede hacer un mal actor al enviar valores malos.

0
artlung