¿Es posible modificar el código del cliente jQuery para llamar a una API remota de forma involuntaria?

3

¿Es posible que alguien modifique el código JQuery de una página remota y haga que llame a las API remotas de una forma diferente a la prevista?

Supongamos que el sitio web www.domain.com tiene un script jquery.js que llama a una API siempre en domain.com pasando un nombre y un apellido:

domain.com/api?name=bla&surname=blo

ahora es posible que alguien modifique el jQuery desde el navegador con algo como Firebug y llame a la API sin nombre ni apellido, por ejemplo, y obtenga una lista completa de personas sin filtrar:

domain.com/api?name=&surname=

Por supuesto, podría revisar mi API para que los dos parámetros estén presentes, pero supongo que no tengo forma de modificar el programa de escucha de la API.

¿Podría mi script jQuery comprobar el dominio desde el que se ejecuta el script? por ejemplo, si alguien guardó mi archivo jQuery localmente y lo ejecutó, ¿se vería en la API remota del mismo modo que si jQuery se ejecutara desde la página web deseada en www.domain.com?

Mi idea es que un script jquery siempre se ejecuta "localmente" ya sea que se descargue desde la página deseada o desde una versión modificada, sin embargo, algunos sitios parecen permitir que una API sea llamada solo desde el script deseado. / p>     

pregunta sarah.ferguson 13.01.2016 - 16:05
fuente

3 respuestas

4

No puede confiar en ninguna protección contra cambios en el código del lado del cliente, solo puede hacer lo mejor para evitarlos (es decir, XSS y CSRF). Cualquier persona puede ejecutar un código JavaScript arbitrario en una página como si fuera la misma página.

Editar :

Como ejemplo, si está utilizando un navegador de escritorio moderno como Chrome, haga clic derecho en cualquier lugar de esta página actual y luego haga clic en la opción para "Inspeccionar" el elemento. Aparecerá una ventana secundaria que resaltará el elemento de su elección. Notará que puede modificar directamente parte del HTML en la página a través de esta interfaz. Además, habrá una pestaña de la consola (junto con otras pestañas útiles de depuración). Si va a la pestaña de la consola, se le dará una pantalla donde puede ejecutar directamente JS en el contexto de la página que está viendo. Si tiene un elemento seleccionado en la pestaña Elementos, puede cambiar el fondo de ese elemento ejecutando el siguiente código JS:

$0.style.background='yellow'

Se pueden usar varias líneas (Shift + Enter) o el contenido de un archivo JS completo se puede copiar y pegar directamente en la página usando esta ventana de consola. Probablemente también notará mientras lo usa que tiene una característica similar a la función de autocompletar. Esto hace que las pruebas y la depuración del código JS sean mucho más fáciles.

También es técnicamente posible que la solicitud se modifique simplemente en tránsito mediante una extensión de navegador instalada o una persona en el medio, o incluso la solicitud podría realizarse utilizando un código JS completamente diferente que se inyecta. Básicamente, la única apuesta segura es realizar todo el saneamiento de entrada necesario en el lado del servidor y solo hacerlo adicionalmente en el lado del cliente para el beneficio de la experiencia del usuario.

Esperemos que esto responda completamente a la pregunta.

    
respondido por el Jonathan Gray 13.01.2016 - 16:09
fuente
1

Alguien ni siquiera necesita modificar el JavaScript, solo puede realizar una solicitud directamente a la API en su navegador web.

La mayoría de los sitios que restringen las API lo hacen mediante algún tipo de autenticación; esto podría ser un encabezado que el script establece que contiene un valor que la API ha proporcionado previamente. Sin embargo, incluso entonces, otros scripts podrían llamar a la misma solicitud y proporcionar el mismo encabezado, y el servidor no tendría forma de determinar que esto no fue un uso intencional de la API.

Esto no es específico de las API: el servidor solo sabe qué información proporciona el cliente, y el cliente siempre puede mentir. Hay formas de hacer que la mentira sea difícil, por ejemplo, mediante la aplicación de comprobaciones de certificados del cliente, que permitirían al servidor verificar que el cliente tiene un conocimiento esperado (una clave privada específica del cliente), pero incluso eso no puede demostrarlo servidor que es un cliente específico (si alguien copió la clave privada específica del cliente, podría hacerse pasar por el cliente deseado; desde el punto de vista del servidor, son idénticos).

    
respondido por el Matthew 13.01.2016 - 16:54
fuente
0

Sí, esto puede ser un exploit de Referencia de objeto directo, o incluso una inyección XSS.

Aquí hay un ejemplo. Digamos que su jQuery ajax hace lo siguiente:

DeleteUserById(100);

¿Qué sucede si editas este valor mediante el uso de un complemento de Firefox como TamperData, o lo editas a través de la consola del desarrollador?

DeleteUserById(1);

En su lugar, eliminó el primer usuario. A continuación, puede eliminar cada usuario en la base de datos. Puede modificar cualquier comandos que se envían desde el cliente en todos JavaScript.

Esta es la razón por la que toda la seguridad debe realizarse en el lado del servidor, no del lado del cliente. Cualquier comprobación realizada por el cliente es en beneficio de la experiencia del usuario.

Con respecto a su ejemplo, depende de la forma en que lo programaron los desarrolladores.

    
respondido por el Mark Buffalo 13.01.2016 - 21:41
fuente

Lea otras preguntas en las etiquetas