¿Cómo asegurar que la API REST no se rastree cuando se sirve contenido público?

5

Tengo una aplicación web ReactJs, una aplicación para Android que consume una API REST desarrollada con django, todo el proyecto es para medios / noticias, la mayor parte de la API REST es contenido público, hay una pequeña parte donde el usuario ha asegurado los puntos finales de API con la autenticación basada en token.

El problema al que nos enfrentamos es que hay más personas que rastrean nuestra API REST y duplican nuestro contenido en muchos lugares y no podemos hacer un seguimiento de ellas y detenerlas, por lo que estamos pensando en alguna forma en que podamos hacer el REST API HARDER que se rastreará.

Mi solución sugerida actual: Cifrado , pero mi comprensión actual del cifrado es que usted encripta las respuestas de la API REST del servidor, y en el cliente de JavaScript lo descifra, pero aún necesita una clave de descifrado o token, por lo que tendrá otros problemas para guardar ese token en el lado del cliente.

¿Hay algún método mejor para asegurar la API que el cifrado?

¿Cuáles son las mejores prácticas para guardar el token en el lado del cliente?

Gracias.

    
pregunta Iliyass Hamza 24.05.2017 - 23:01
fuente

2 respuestas

3

Solía escribir scrappers web como un trabajo, y aquí están mis dos centavos por los problemas más difíciles que enfrenté cuando estaba del otro lado de tu problema.

  1. Cargue parte o todo el contenido a través de varias llamadas AJAX. Si el scrapper no se adapta a su sitio, esto detendrá a los scrappers. En la práctica, podría responder con un JSON que solo tendría el principio del contenido y un token único que se solicitaría para obtener la siguiente parte del contenido.

  2. Además, si sabe que su API REST solo debe usarse desde su aplicación React, puede agregar un token de larga duración de Django a la plantilla principal React. Luego, la API REST requeriría el ID de contenido y ese token único. En su base de datos, debe asignar ese token a una dirección IP determinada y hacer que caduque en un tiempo razonablemente pequeño. Esto requeriría que los robots obtengan el lado HTML de la aplicación para obtener ese token y luego el contenido.

  3. La aceleración era generalmente una molestia. Las implementaciones que encontré se basaron en la dirección IP y se permitió a los usuarios 10 solicitudes por segundo. Eso es mucho más de lo que haría un humano típico. Para pasar eso, mi código tendría que hacer un seguimiento de la hora en que se enviaron diez solicitudes, y luego, en el tiempo de espera, se solicitarán diez piezas más de contenido.

  4. Agrega un honeypot al disallow de tu robots.txt . Los bots nefarios no siguen las reglas. También como parte de ese mismo trabajo, redistribuiríamos el contenido y haríamos que otros intentaran eliminarlo. Esta fue la forma más efectiva de detener a la mayoría de los bots: se les permitieron tres impactos al honeypot, después de lo cual se colocaron en la lista negra durante 36 horas a menos que tuvieran éxito en la solución de un captcha (para eso utilizamos una herramienta externa). Para la integración de Django, utilizamos eso codificado como un middleware para que se aplique a todas las páginas. Para que esto tenga un problema de rendimiento mínimo, usamos la memoria caché de Django para almacenar qué direcciones IP estaban en la lista negra o en la lista blanca (se agregaría una a la lista blanca si lograban resolver el captcha).

respondido por el ChrisR 25.05.2017 - 01:42
fuente
2

Evitar que otros rastreen su sitio web público / API es un problema difícil.

Puede intentar limitar la velocidad y bloquear las IP de los clientes que realizan demasiadas solicitudes rápidas a la API REST. Esto puede impedir que aquellos que usan métodos simples para rastrear su API REST, pero no lo ayudarán con rastreadores que usan técnicas más avanzadas. No estoy seguro de cuál es su situación particular.

También, los servicios como enlace pueden proporcionar protecciones contra el raspado de datos / rastreo web que puede ser fácil de implementar como un intento rápido para enfrentar el problema.

    
respondido por el SecretSasquatch 25.05.2017 - 00:40
fuente

Lea otras preguntas en las etiquetas