Evitar el acceso a la aplicación web fuera de las aplicaciones de contenedor.

Estoy creando una aplicación web que envolveré en una vista web para dispositivos Android e iOS. La vista web será un código muy simple que apunta básicamente a mi aplicación web. Por ejemplo: www.myapp.com

Quiero que los usuarios solo puedan acceder a la aplicación web (usarlo) después de que compraron las aplicaciones en la tienda de aplicaciones. ¿Cómo puedo evitar que los usuarios descomprimen la fuente y vaya directamente a la URL?

Solutions Collecting From Web of "Evitar el acceso a la aplicación web fuera de las aplicaciones de contenedor."

No hay manera de evitar que el usuario obtenga la URL y acceda directamente a ella, si realmente quiere, y luego la postula en un foro en línea.

Hay una manera de evitar este escenario en particular, pero todavía no protege la aplicación por completo. La idea es enviar la aplicación con una key secreta en su file binary que se utiliza para firmar todas las requestes enviadas desde su sitio, consulte aquí para get más detalles.

De esta forma puede asegurarse de que la request proviene de alguien que tenía la key de API, lo más probable es que su aplicación. Esto evitaría el escenario donde la URL se publica en un foro y la aplicación se accede directamente a través del browser web.

Este mecanismo se utiliza normalmente para proteger las API de JSON, pero también se puede usar para proteger el acceso a páginas web desde una aplicación de vista web.

Pero esto no impide que alguien inspeccione el file binary para acceder a la key de la API, y produce otra aplicación o progtwig que firma requestes, creando un clon de su aplicación.

Por ejemplo, las aplicaciones como Twitter tenían sus keys expuestas en las publicaciones del blog .

Por lo tanto, es una solución de security versus conveniencia: si quiere cubrir la URL que está accediendo desde los browseres, use una key de API y escanee periódicamente la tienda de Android para las aplicaciones de clon e informe que se cierren. Esto debería ser infrecuente y fácil de detectar, y también los usuarios se lo comunicarán.

Si desea más security, coloque la aplicación de forma gratuita y administre el inicio de session / pagos: es mucho más complicado y desalentará a los usuarios, lo que significa less ventas. El uso de una key API parece ser la mejor solución de security / conveniencia.

Esta pregunta me restring a otra discusión aquí en la que participé con un problema similar. La respuesta aceptada tiene una extensa list de cosas que puede probar.

Para mi propia respuesta, este es el breve resumen del artículo "Verificando las llamadas de background de las aplicaciones de Android" que he vinculado:

Utiliza la class GoogleAuthUtil, disponible a través de los services de Google Play, para recuperar una cadena llamada "ID Token". Envía el token a su back-end y su back-end puede usarlo para verificar rápida y económicamente qué aplicación lo envió y quién usó la aplicación.

En general, el enfoque es agregar un código para verificar que las requestes que llegan a su URL sean producidas por usuarios "autenticados / pagos" (que en el ejemplo de blog de Android es mediante la verificación de su count de Google Play Services).

La verificación del lado del cliente sería inútil, porque si alguien sabe que la URL podrá acceder a él. Y, no importa cuánta ofuscación de código uses, nunca se ocultará de un hacker determinante. Además, el pirateo incluso no es necesario si la request es la ruta a través de un proxy, el logging revelará la URL de todos modos.

Debe hacer una verificación del lado del server y tener un script simple para ver de dónde provienen esas requestes.

Cada request HTTP proporciona cierta información sobre el cliente. Puedes ver esa información para determinar de dónde provino exactamente la request. Para agregar un poco más de security, puede modificar y establecer su propio valor en el encabezado HTTP desde el lado del cliente.

La implementación sería diferente en Android y iOS, ya que los desafíos también son diferentes.

Androide

En Android, es relativamente fácil publicar una aplicación en el mercado, y si alguien conoce tu url, pueden hacer el mismo truco con la request HTTP y lanzar otra aplicación. Para evitar eso:

Cada aplicación de Android está firmada por un certificate, puedes enviar un valor de firma con el encabezado HTTP, verificarlo en el lado del server. Mira esto para get la firma de la aplicación de Android.

Recuerde que la firma de la aplicación es única y así es como Google Play almacena la identidad de una aplicación, por lo que no es de otra manera que otro desarrollador se aferre a eso. si no lo satisface agregue un valor de encabezado adicional (algún secreto) y cámbielo cada vez que actualice.

HttpURLConnection y otras API HTTP de Android o de Apache brindan soporte para hacerlo.

iOS

Mira esto para saber cómo modificar el encabezado http en iOS.

En este caso, todavía existe un problema: cualquier persona puede crear una aplicación de iOS y hacer lo mismo, pero en iOS, las personas no pueden simplemente hacer eso, ya que cada aplicación pasa por un largo process de verificación de Apple. Incluso puede tener un secreto rotativo, o generarlo sobre la marcha, con cada nueva actualización de aplicación o request http, que solo su server podrá verificar para dificultar las cosas.

Creo que debería usar OAuth 2 para restringir el acceso a su server web.

Esta pregunta puede ser de ayuda: Opciones para autenticar de forma segura el acceso mobile con OAuth2

Puede download desde un service web la URL envuelta (use https) y de esa manera la URL nunca estará dentro de la aplicación para descomstackrla.

De todos modos, una request web podría ser monitoreada por un rastreador y posiblemente aún recuperada.

Puedes probar estas forms:

  1. Use shrinker, optimizador, ofuscador y class de preverificador como PROGUARD
  2. Divida la url del website en más piezas y colóquelo en sus cadenas.xml
  3. Escribe encriptación como AES o DES para encriptar tus cadenas de url en cadenas.xml
  4. En time de ejecución, puede descifrar, combinar su cadena url y establecerla en una variable. Y cuando lo usa, puede establecer esa variable en nula para que las personas no puedan getla en la memory

Creo que esto oculta tu cadena y la gente no puede encontrarlo fácilmente,