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

12

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 suplantar 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?

Daniel Bingham
fuente
¿Las llamadas ajax no están autenticadas por completo? ¿Creas sesiones para cada uno? ¿Hay patrones para el abuso? ¿Y el problema es la manipulación específica o más la cantidad de carga que agrega al sitio?
artlung
¿Puedes publicar más detalles por favor? ¿Qué están haciendo las llamadas AJAX? ¿Qué están manipulando? ¿Qué problemas ocurren si el script se llama fuera de AJAX?
DisgruntledGoat
Realmente no estoy preguntando sobre una circunstancia específica, sino por una solución general aplicable a muchas circunstancias. Si existe tal solución, que parece que no existe.
Daniel Bingham el

Respuestas:

12

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.


fuente
2
+1 .. al igual que es imposible evitar que las personas guarden copias locales de cualquier cosa que muestre su navegador. Es más un concurso para ver si puedes hacer que se den por vencidos y pasar a otra cosa antes de que se den cuenta.
Tim Post
6

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.

Cabra descontento
fuente
3

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

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

Fuente

ellos conmemoran
fuente
2
buen punto, suponiendo que el abusador no use ajax o falsifique ese encabezado HTTP
Adam
1

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 un envío de formulario.

HTH

digit1001
fuente
+1 para "Bzzt", que se vuelve mucho más divertido en el contexto de "Bzzt - ¡gracias por jugar!" seguido de un lento desvanecimiento a negro acompañado de una prohibición de tres horas impuesta por un conjunto de cookies en la máquina del usuario (estoy seguro de que recibirían el mensaje)
danlefree
0

Creo que una parte importante de su solución será limitar el 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 al ajax con los datos devueltos 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 las Xsesiones, para cada solicitud de ajax, su JavaScript necesitará devolver esa clave o el ajax devolverá un error. Una vez que su página encontrados X+1llamadas ajax, obligar al usuario a hacer algún tipo de acción (tal código de imagen? Tal vez incluso algo así como una mousemoveo tapevento dependiendo de la UA) antes de enviar una nueva clave de sesión por el cable (fuera de banda desde el Ajax el original) y luego reiniciar 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.

artlung
fuente