Encriptando la respuesta de la API en una aplicación de una sola página

0

Estoy creando una aplicación de una sola página (React-Redux en FE, Rails-API BE) que realiza un montón de llamadas REST API para obtener cierta información para los usuarios que han iniciado sesión. Algún subconjunto de esa información (base de datos de categorización) es más confidencial que otra información. Nuestro objetivo es, para que sea tan difícil como sea posible, que los datos se puedan extraer fácilmente de la respuesta de la API o se puedan raspar.

Según mi investigación, entiendo que no existe ningún método que haga posible el 100% de la seguridad de los datos, pero me gustaría hacerlo lo más difícil y frustrante posible sin afectar negativamente a la UX. También estamos más preocupados por el hecho de que la información es esencialmente simple JSON cuando viene del servidor al cliente, que es mucho más fácil de explotar que de raspar (ya que la IU en este caso no es la más fácil de eliminar).

Hasta ahora, según mi investigación, parece que debería hacer lo siguiente:

  1. Use TLS / SSL para las llamadas a la API que evita los ataques de intermediarios y encripta los datos en tránsito. Pero esto no resuelve el problema de un usuario final malicioso.

  2. Para hacer eso, vamos a hacer algo de limitación de velocidad en la API, y también podemos suspender temporalmente a los usuarios / raspadores que aparecen como 'bots' en los registros (ya que todos están registrados) en). Pero eso puede ser derrotado solo por usuarios maliciosos que aparecen como usuarios más pacientes.

  3. Lo mejor, parece que podría ofuscar la respuesta de la API de dos maneras:

    • Ofrezca claves de respuesta o uso que no revelen datos tan fácilmente.
    • Envíe una respuesta encriptada desde el servidor que javascript descifra usando una clave que podría estar oculta en el código. De esta manera, los datos no serían visibles en las Herramientas de desarrollo o para cualquier otra persona que realice la llamada a la API.

Entonces, mi pregunta, ¿es el último punto anterior (el segundo punto en (3) el cifrado de respuestas) una forma efectiva de lograr mi objetivo? Y si es así, ¿cuáles son algunas cosas que debería tener en cuenta para lo mismo?

Si bien entiendo que ninguno de estos métodos es infalible, me gustaría entender mejor las mejores prácticas para tales casos de uso. ¡Cualquier pensamiento o idea sería muy apreciado!

¡Gracias!

    
pregunta geoboy 06.09.2016 - 21:06
fuente

3 respuestas

1

Como lo entiendo bien, tienes un sitio web que sirve algunos datos y simplemente quieres evitar que los usuarios lo aprovechen.

La última vez que abordé este problema de la siguiente manera:

  1. Recopile el registro de operaciones en la base de datos, lo que es bueno para almacenar registros. Algo horizontalmente escalable. Recopile toda la información que pueda, por lo que no es típico el registro HTTP sino el registro detallado, idealmente de forma estructurada.
  2. Analice los registros e intente aislar a los usuarios que hacen mal uso del servicio
  3. Bloquear a los usuarios que hacen mal uso del servicio

Este es un método bastante difícil pero muy efectivo, y también hay otras formas que se pueden usar con él, vea a continuación.

Básicamente, toma estos registros e intenta "comprimirlos" de la forma en que se produce algún tipo de informe con resúmenes. Dicho informe contiene solicitudes por hora durante, por ejemplo, Miércoles, variedad de datos solicitados, duración de la actividad, p. Ej. de 9 a.m. a 5 p.m. y así. Sawmill produce informes similares, así que es bueno echarle un vistazo. Cuantos más datos tenga, menos falsos positivos y mejor detección tendrá. Lo principal de esto es que se ejecuta periódicamente, por lo que, por ejemplo, podría estar procesando los registros de la forma en que solo imprime los resultados diariamente y los almacena en la base de datos como informes que se generan por usuario por día, y luego puede producirlos semanalmente. Informes mensuales y anuales, y de esta manera puede decir con precisión quién está haciendo un mal uso.

Creo que es mejor limitar la cantidad de solicitudes por minuto / hora / día. Esto se puede hacer usando otra base de datos como Redis, por ejemplo. Si se excede el límite, simplemente devuelva el error relevante. Piense como "métricas en tiempo real". Si supera cierto umbral de solicitudes totales por período, simplemente se bloqueará.

Otra idea es utilizar invitaciones. Como lo hizo Google Mail en el pasado. De esta manera es más fácil rastrear a los usuarios malintencionados.

Otra cosa sería centrarse en la seguridad de la cuenta. Para asegurarse de que los usuarios son reales (como la confirmación del número de teléfono como en el pago de Facebook o CC) y que las cuentas no se comparten, por ejemplo. utilizado por dos personas al mismo tiempo.

En cuanto a la confusión de datos, es un buen enfoque ya que efectivamente limita la cantidad de actores maliciosos. Una de las formas de hacerlo es cambiar los algoritmos con frecuencia o incluso codificarlos por adelantado y cambiarlos automáticamente cada mes. La forma en que no se puede automatizar. Sin embargo, tenga en cuenta que hay herramientas como PhantomJS que pueden actuar como un navegador normal y hacer eso de todos modos. Por lo tanto, tal vez también se necesite algo de Captcha cuando alcanzas cierto límite.

También puede cambiar el formato de la base de datos de vez en cuando, como las respuestas json.

Y con respecto a los usuarios, puede solicitarles que inicien sesión a través de la cuenta de Google, por ejemplo, para que sea más fácil que revisarlos por su cuenta, al igual que con Facebook.

Y no olvides incluir el EULA. Y en T & C escribe claramente lo que está permitido y lo que no.

    
respondido por el Aria 06.09.2016 - 22:26
fuente
3

Su API debería verificar quién está haciendo la llamada y realizar cualquier tipo de restricciones en el lado del servidor.

La forma de lidiar con esto es implementar la autorización del lado del servidor y mitigar contra referencia de objeto de seguridad y control de acceso a nivel de función . Estos deberían ser estándar de todos modos.

Si su API devuelve información que no desea que la persona que llama pueda ver, implementó la API incorrectamente. No hay nada que pueda hacer para proteger los datos en ese momento, ya que el usuario final puede simplemente monitorear el tráfico de la red utilizando algo como la consola Chrome. Incluso si lo cifra, el código para descifrarlo se encuentra en el navegador del usuario final y se puede realizar ingeniería inversa. Supongo que podría retener la clave a todos excepto a los usuarios autorizados, pero ¿cuál es el punto de usar el ancho de banda al devolver datos que no se pueden leer? En lugar de cifrarlo, también puede redactarlo, por ejemplo. Reemplácelo con un alboroto completamente al azar, o reemplácelo con cadenas vacías. Hazlo del lado del servidor.

    
respondido por el John Wu 08.09.2016 - 00:30
fuente
2

Un navegador web no es una plataforma DRM, punto final.

El estado de la técnica en esta área general son las técnicas de distribución de malware y la ofuscación de javascript. Google es la mejor fuente para las últimas noticias, este espacio cambia rápidamente.

En comparación con el estado de la técnica, las técnicas mencionadas en la pregunta no desviarían a un analista experto interesado en recuperar sistemáticamente los datos que están disponibles durante más de un par de días. El paso por el código del lado del cliente con un depurador revela los secretos deseados muy rápidamente.

    
respondido por el Jonah Benton 21.09.2016 - 05:34
fuente

Lea otras preguntas en las etiquetas