Cómo proteger mis puntos finales de API

7

Tengo una API escrita en nodejs y tengo una interfaz de usuario escrita en angularjs. Quiero que se llame a mi API solo a través de mi frontendapp y no de ninguna otra fuente.

por ejemplo Tengo un punto final llamado myhost.com/posts/id y cuando se elimina el método, se eliminan las publicaciones. No quiero que un atacante acceda a este punto final y elimine mis publicaciones. ¿Cómo puedo prevenirlo?

    
pregunta Avraam Mavridis 11.11.2014 - 11:10
fuente

3 respuestas

6

Desafortunadamente, creo que esto no es posible de una manera segura. Déjame explicarte por qué.

Desea que su aplicación frontend tenga una forma de identificarse con la API. En otras palabras, usted quiere autenticación.

Pero la autenticación requiere la existencia de algún tipo de datos secretos únicos que la aplicación frontend pueda usar para distinguirse de otras aplicaciones. Esto puede ser un secreto compartido (contraseña, "clave de API"), una clave de cifrado asimétrica privada o algo más todavía. Pero sea lo que sea, tiene que permanecer en secreto, ya que si otra aplicación puede copiarlo, puede pasar como su aplicación de frontend.

La pregunta es, ¿dónde vas a almacenar ese secreto?

Si está almacenado dentro del código de la aplicación en sí, o directamente accesible para él, es vulnerable a la ingeniería inversa o las vulnerabilidades en su aplicación de front-end, sin importar cuántas capas de direccionamiento criptográfico use para ocultarlo. Este es el defecto de seguridad fundamental que llevó a la falla de casi todos los esquemas DRM diseñados hasta la fecha.

Si se almacena en alguna ubicación a prueba de manipulaciones del equipo cliente (por ejemplo, el chip TPM, la instalación de administración de claves de confianza del sistema operativo), entonces la pregunta es: ¿cómo llega inicialmente? ¿Y cómo va a acceder a él desde el código Javascript, que tiene capacidades limitadas de acceso al sistema operativo de bajo nivel?

Si se almacena de forma remota, solo está cambiando el problema de la autenticación de la aplicación en otro lugar: ¿cómo se va a autenticar su aplicación de usuario en el servidor remoto? O, en otras palabras, ¿qué impide que otra aplicación acceda a ese servidor remoto exactamente de la misma manera?

Mi conclusión es que no hay una manera realmente segura de autenticar una parte del software JS. Tendrá que diseñar su API de una manera que sea segura frente a la entrada de clientes maliciosos y, si desea una manera de prohibir a los clientes comprometidos de todos modos, proporcione a los clientes "claves de API" revocables que pueda prohibir fácilmente en el lado del servidor. la forma en que la mayoría de los servicios web (y los nuevos DRM) lo hacen.

    
respondido por el Hadrien G. 11.11.2014 - 14:07
fuente
3

Una buena manera de comenzar es evitar las conexiones a la aplicación API desde cualquier cosa, excepto las direcciones de cliente válidas, en su caso, su servidor angularjs.

Se obtendría seguridad adicional al implementar una clave de API compartida revocable entre cada instancia de angularjs y su API, de modo que pueda revocar los permisos de las instancias comprometidas.

Además, es bueno confirmar que el tráfico entre la aplicación frontend y el servidor API está cifrado, incluso si está solo en su red interna.

    
respondido por el August Johnson 11.11.2014 - 14:52
fuente
0

Si su interfaz puede usar la API, cualquiera puede usar la API. En este caso, su interfaz / navegador es solo una capa de abstracción para llamar a su API, nada impide que alguien se deshaga de esa capa de abstracción y llame a la API por su cuenta.

No se puede preguntar de forma confiable "es que esta llamada a la API proviene de mi interfaz", porque cualquiera puede mentir en la llamada a la API y decir que proviene de su interfaz.

Uno podría pensar que pueden hacer que el servidor web le proporcione algún tipo de clave cuando abra la página por primera vez, almacene la clave en el navegador y luego envíe esa clave con cada llamada a la API. Pero, ¿qué impide a alguien obtener esa clave una vez desde su servidor web y luego usar la API de forma maliciosa? Si el navegador puede solicitar la clave, cualquiera puede solicitarla.

Para limitar el acceso, necesita algún tipo de autorización. Entonces, su API debe decir "¿esta persona que desea eliminar publicaciones tiene permiso para hacerlo?". En este caso, no importa ni debería importar de dónde proviene la llamada a la API, solo si la persona que llama a esta API tiene la autorización adecuada para hacerlo.

Una forma de hacerlo es mediante la implementación de algún tipo de función de inicio de sesión y, en un inicio de sesión exitoso, hacer que el servidor recupere una clave única. El servidor debe saber de una u otra forma que el servidor le dio esta clave a este usuario. Puede hacer esto recordando que esta clave pertenece a ese usuario en el servidor o usando algo como un token web JSON. Lo ideal sería utilizar algún tipo de biblioteca o marco para realizar esta autenticación. Con cada llamada a la API, puede enviar esta clave y el servidor sabrá que tiene permiso para realizar esta acción, ya sea que haya hecho clic en el botón frontal derecho o si utiliza algún otro programa para realizar la llamada.

    
respondido por el Burak 26.07.2018 - 16:20
fuente

Lea otras preguntas en las etiquetas