Hola Habr!
Mi nombre es Eugene, soy un desarrollador Full Stack JS, la pila actual es Node.js + React + React Native. He estado en desarrollo por m谩s de 10 a帽os. En desarrollo m贸vil prob茅 diferentes herramientas de Cordova para React Native. Despu茅s de adquirir experiencia con Cardova, me di cuenta de que me gustar铆a crear interfaces nativas, en mi opini贸n, WebView no deber铆a ser la aplicaci贸n completa. Pero esto no significa que no deba usarse en absoluto.
Por invitaci贸n de colegas de Sberbank, en esta publicaci贸n quiero hablar sobre aplicaciones m贸viles h铆bridas. Con el enfoque correcto, esta es una excelente manera de implementar r谩pidamente la idea de un producto que funcione bien, suficiente para el primer lanzamiento de su inicio.
Fuente: srishta.comTambi茅n te contar茅 un poco sobre c贸mo puedes usar WebView y c贸mo los atacantes pueden usarlo en tu contra. Los ejemplos en el art铆culo se mostrar谩n usando el marco React Native, pero las mismas ideas se pueden implementar sin 茅l.
Un poco sobre startups
Comenzar茅 con las diferencias fundamentales en el lanzamiento de nuevas empresas en nuestro pa铆s y en Occidente. Le dir茅 c贸mo WebView puede ayudar aqu铆, dar茅 ejemplos pr谩cticos de la interacci贸n de elementos web y nativos, as铆 como consejos de seguridad al interactuar con aplicaciones de terceros.
Como regla general, para que una startup tenga 茅xito, debe comenzar r谩pidamente. Si pierde tiempo, sus competidores lo evitar谩n. Esto se entiende tanto en nuestro pa铆s como en Occidente. Pero el enfoque ruso para el lanzamiento, como regla, es mucho m谩s completo, en el mal sentido de la palabra.
Todas
las startups rusas sin 茅xito comienzan y se desarrollan en aproximadamente el mismo escenario. Los errores m谩s comunes est谩n relacionados con la planificaci贸n estrat茅gica del desarrollo de productos de software. La gerencia piensa que el lanzamiento es posible solo despu茅s de la implementaci贸n del 110% de todas las funcionalidades y todos los matices. Con este enfoque, surge r谩pidamente un d茅ficit presupuestario, ya que los costos de desarrollo son altos y no hay ingresos de una startup. La b煤squeda de inversiones adicionales, un c铆rculo interminable de aprobaciones y revisiones lleva mucho tiempo, el producto aparece en el competidor. Eso es todo, el marat贸n est谩 perdido.
Las startups europeas y americanas act煤an de manera diferente. Para empezar, se limitan solo a la versi贸n web m贸vil con una parte funcional m铆nimamente suficiente. Se puede ver tanto desde computadoras de escritorio como desde dispositivos m贸viles. 隆Y en esta etapa el proyecto est谩 listo para lanzarse! Despu茅s del lanzamiento, la aplicaci贸n est谩 hecha para dispositivos m贸viles.
Como regla general, la aplicaci贸n no difiere en caracter铆sticas b谩sicas de la versi贸n web. Expande las posibilidades de interacci贸n con el usuario, por ejemplo, a trav茅s de notificaciones push. Este enfoque garantiza el cumplimiento de la condici贸n principal: inicio r谩pido, primer beneficio r谩pido. Los ingresos de la primera etapa pueden invertirse en desarrollo. En el futuro, el proyecto se puede escalar y desarrollar seg煤n lo deseado sin un d茅ficit presupuestario, realizando un enfoque iterativo sin fin para agregar nuevas funcionalidades y desarrollar la interfaz de usuario.
Propongo considerar con m谩s detalle la etapa en la que ya existe una versi贸n m贸vil del sitio y necesita desarrollar una aplicaci贸n para dispositivos m贸viles. Entonces, creamos un sitio, lo que significa que est谩bamos desarrollando la API del servidor, la interfaz y la l贸gica empresarial. Dos de los tres componentes son
- interfaz y l贸gica: est谩n presentes en la aplicaci贸n m贸vil. De acuerdo, no quiero volver a escribirlos.
Combinando lo mejor de las aplicaciones nativas y web
Existen herramientas enfocadas en el desarrollo de aplicaciones nativas. Otros son para la web. La ventaja de las aplicaciones nativas es que pueden usar todo el potencial funcional del tel茅fono. Pero desarrollarlos en comparaci贸n con las aplicaciones web es bastante dif铆cil. La web proporciona un inicio f谩cil, pero limita en gran medida las capacidades de la aplicaci贸n.
* para reducir la tautolog铆a de las aplicaciones web, llamar茅 aplicaciones m贸viles, cuya mayor parte de la l贸gica y la interfaz se implementa en el lado del navegadorLas aplicaciones h铆bridas creadas con el componente WebView permiten combinar todas las ventajas de las aplicaciones nativas y la web. Por supuesto, hay desarrolladores meticulosos que est谩n categ贸ricamente en contra de WebView en cualquiera de sus manifestaciones. Argumentan esto con el hecho de que la aplicaci贸n debe ser completamente nativa de inmediato, para que pueda usar todas las funciones de un dispositivo m贸vil, as铆 como proporcionar un rendimiento de interfaz de usuario c贸modo. Pero en muchos casos, cuando las capacidades de la versi贸n m贸vil del sitio son suficientes, puede reducir el tiempo del primer lanzamiento haciendo una aplicaci贸n h铆brida y reemplazarla gradualmente por una nativa.
Las aplicaciones h铆bridas no siempre son malas y no son extensibles. Pueden ser convenientes y productivos. Con el uso adecuado, este enfoque ayuda a obtener el tiempo suficiente para desarrollar una aplicaci贸n de calidad, y no para lanzar una aplicaci贸n nativa a toda prisa.
Hay varias situaciones en las que es aconsejable utilizar aplicaciones h铆bridas. Son buenos como un trozo temporal para un inicio r谩pido, cuando tenemos una versi贸n m贸vil del sitio lista y la aplicaci贸n m贸vil era necesaria "ayer". Dicha aplicaci贸n puede crearse en unas pocas horas, ejecutarse en producci贸n. Los usuarios tendr谩n la oportunidad de trabajar con una aplicaci贸n m贸vil, y usted tendr谩 la oportunidad de trabajar en una versi贸n m谩s completa en plazos menos ajustados (si es necesario).
Aqu铆 hay un ejemplo. Recientemente, los colegas necesitaban urgentemente una aplicaci贸n m贸vil. En la versi贸n web, ten铆a ocho elementos de men煤, y los mostramos a trav茅s de WebView. Y luego reemplazaron un art铆culo. Dio la casualidad de que lanz贸 la aplicaci贸n no en un mes o tres, sino en solo unos d铆as. Luego lo transfiri贸 gradualmente al nativo.
Una soluci贸n h铆brida no siempre es temporal. Sus capacidades le permiten reutilizar en la aplicaci贸n la base de c贸digo creada anteriormente para la versi贸n web. Por ejemplo, animaciones espec铆ficas ya creadas en Canvas. WebView tambi茅n es conveniente cuando se utiliza alg煤n tipo de servicio de terceros. Otra opci贸n es cuando tiene una interfaz compleja que es m谩s f谩cil de conectar a trav茅s de WebView.
C贸mo usar webview
Toma un gui贸n popular. Queremos usar la versi贸n m贸vil del sitio y el men煤 nativo. Creamos una aplicaci贸n nativa con un men煤, pero en lugar de contenido, conectamos la versi贸n m贸vil del sitio a trav茅s de WebView (hasta ahora sin ning煤n cambio).
En el gif puedes ver 2 men煤s. El men煤 derecho es parte del sitio, implementado en la web, a la izquierda est谩 el men煤 nativo, implementado dentro de la aplicaci贸n m贸vil. Para obtener la primera aproximaci贸n a la aplicaci贸n nativa, solo necesitamos ocultar el men煤 que se implementa en la web. Aqu铆 se muestra cu谩nto
c贸digo se necesita para mostrar la versi贸n web dentro de la aplicaci贸n a trav茅s de WebView:
export default (props) => ( <Layout {...props} name="Example1"> <WebView source={{uri: '<a href="https://provincehotels.ru/">https://provincehotels.ru/</a>'}} style={{flex:1}} /> </Layout> );
El siguiente ejemplo trata sobre c贸mo la parte nativa puede interactuar con la web.
El robot est谩 dibujado en Canvas, esto es parte del sitio web. Y el cambio a 茅l se basa en la interfaz de usuario nativa. Se ver谩 diferente en diferentes tel茅fonos. Podemos controlar los movimientos del robot usando un interruptor. Puede y viceversa, con algunos elementos de la interfaz web para influir en la aplicaci贸n. React Native proporciona para esto una API especial para la interacci贸n entre la web y la parte nativa.
A continuaci贸n se muestra el
c贸digo para usar esta animaci贸n. Dise帽o: todo el espacio. Picker es una parte nativa que puede seleccionar entre las opciones desplegables para el estado del robot. WebView: un contenedor para mostrar la web, dentro del cual se dibuja un robot.
const states = [ 'Idle', 'Walking', 'Running', 'Dance', 'Death', 'Sitting', 'Standing' ]; const uri = 'https://artexoid.ru/181212/example2/'; export default class Example2 extends React.Component { myWebView = React.<i>createRef</i>(); state = { robot: states[0] }; render() { return ( <Layout { ...this.props } name="Example2"> <Picker mode="dropdown" selectedValue={this.state.robot} onValueChange={(item) => { this.setState({robot: item}); this.myWebView.current.postMessage(item); }} > {states.map((item => <Picker.Item key={item} label={item} value={item} /> ))} </Picker> <WebView ref={this.myWebView} source={{uri}} style={{flex:1}} /> </Layout> ); } }
Tales casos surgen a menudo. Por ejemplo, realizamos una solicitud para pruebas y certificaci贸n de dentistas. Para cada respuesta en la prueba, se dibuj贸 animaci贸n dentro de las preguntas, implementada usando Canvas en la web. El desaf铆o era crear una aplicaci贸n m贸vil, con esta prueba. Usando WebView, pudimos mostrar animaciones de la web, mientras creamos el resto de la interfaz de forma nativa. La animaci贸n funcion贸 bien incluso en tel茅fonos inteligentes m谩s antiguos.
驴C贸mo se hacen las inyecciones?
Hasta 2013, el navegador Opera utilizaba su propio motor Presto, pero luego fue transferido al motor Blink de Google. Muchos usuarios est谩n muy molestos. El video
"Por qu茅 Opera Webkit" arroja luz sobre los motivos de esta transici贸n. Los principales culpables son las grandes corporaciones como Google o Facebook, que no probaron el c贸digo de sus productos en Opera y prohibieron la visualizaci贸n de p谩ginas en este navegador, citando el hecho de que no es lo suficientemente popular entre los usuarios.
Por ejemplo, vas a Gmail a trav茅s de Opera y ves: "Error de JavaScript". Escribes para apoyar, obtienes la respuesta: "Opera no es compatible con nosotros, no escribiremos c贸digo para ello". Primero, Opera contrat贸 desarrolladores para escribir inyecciones, un c贸digo especial que estaba incrustado en Gmail y que le permit铆a funcionar en Opera. Pero gradualmente los sitios como Gmail se hicieron m谩s grandes. Opera se rindi贸 y cambi贸 el motor.
Entonces, 驴de qu茅 estoy hablando? Ah s铆, es hora de hablar sobre las inyecciones:
En el gif: un ejemplo de inyecci贸n que cambia el comportamiento de los sitios. Supongamos que tenemos el sitio de otra persona y hacemos una inyecci贸n de estilos: ocultamos el men煤 correcto y el control deslizante que sale a la derecha. Esta es una inyecci贸n de estilos. La l贸gica del sitio no cambia, solo la pantalla.
const addStyles=` const newCSS = 'div[class*=svgHamburger],div[class*=drawerPanel] { display: none !important; }' head = document.head || document.getElementsByTagName('head')[0], style = document.createElement('style'); style.type = 'text/css'; style.appendChild(document.createTextNode(newCSS)); head.appendChild(style); `; const uri = 'https://provincehotels.ru/'; export default (props) => ( <Layout { ...props } name="Example1"> <WebView source={{uri }} style={{flex:1}} injectedJavaScript={addStyles} javaScriptEnabled={true} /> </Layout> );
El c贸digo escrito en verde es inyecci贸n. Oculta los elementos, no puede hacer clic en ellos, no puede interactuar con ellos. Parece una aplicaci贸n completamente nativa, sin controles web.
La siguiente inyecci贸n es m谩s interesante. Digamos que tenemos una aplicaci贸n m贸vil y tiene un navegador m贸vil incorporado.
Una persona sigue el enlace, y lo sustituimos f谩cilmente con la p谩gina de Facebook en la que debe ingresar un nombre de usuario y contrase帽a. Si una persona ingresa, la aplicaci贸n lo intercepta. Aqu铆 est谩 el
c贸digo :
const addScripts=` document .querySelector('input[type=password]') .addEventListener("change", (event) => alert(event.target.value)); `; const uri = 'https://www.facebook.com/'; export default (props) => ( <Layout { ...props } name="Example4"> <WebView source={{uri }} style={{flex:1}} injectedJavaScript={addScripts} javaScriptEnabled={true} /> </Layout> );
Tal c贸digo se llama inyecci贸n l贸gica. Por lo general, es m谩s dif铆cil, pero no mucho. Es decir, robar una contrase帽a es m谩s f谩cil que ocultar controles.
Minuto de paranoia: navegadores integrados en aplicaciones
Como sabe, muchas aplicaciones tienen navegadores integrados (WebView), por ejemplo, VKontakte, Telegram, Gmail, WhatsApp, etc. Podemos confiar en las grandes empresas, pero WebView tambi茅n es utilizado por una gran cantidad de aplicaciones con un peque帽o n煤mero de estrellas y autores dudosos, por ejemplo, lectores QR, administradores de archivos, carcasas de c谩maras, etc. ... Instala la aplicaci贸n, lee el c贸digo a trav茅s de ella, haz clic en el enlace, ingrese datos confidenciales, y la aplicaci贸n, como se muestra en el ejemplo anterior, tiene acceso a ellos. Y luego no puede rastrear d贸nde fluyen estos datos. Por lo tanto, para abrir enlaces, use solo navegadores confiables.
Hay sitios que solicitan un nombre de usuario y contrase帽a cada vez. Y hay quienes rara vez hacen esto, una vez al mes, una vez al a帽o. Curiosamente, la segunda opci贸n es m谩s segura en t茅rminos de p茅rdida de datos a trav茅s de WebView. Por ejemplo, ingresa al sitio desde alg煤n navegador izquierdo. El sitio requiere un nombre de usuario y contrase帽a, y no le parece extra帽o, siempre lo hace. Y en el caso de que rara vez se requiera autorizaci贸n, lo desconfiar谩.
Curiosamente, la autenticaci贸n de dos factores no protege contra tal ataque, solo contra el robo de contrase帽as. El hecho es que despu茅s de la confirmaci贸n, se le devuelve un token en respuesta a usted, que, a su vez, a煤n no tiene una autorizaci贸n de dos factores, y es f谩cil interceptarlo. Es decir, si ingres贸 el inicio de sesi贸n y el c贸digo de SMS una vez, el navegador recibe un token, que puede usarse repetidamente. Con esta ficha confirmada, puede hacer lo que quiera, por el tiempo que la ficha siga siendo relevante. En general, no conf铆e demasiado en los navegadores integrados.
Puede familiarizarse con ejemplos de esta publicaci贸n a trav茅s de aplicaciones de demostraci贸n. En el sistema operativo Android, debe descargar Expo Project, una herramienta para trabajar con JavaScript y React Native. Despu茅s de instalar Expo, solo necesita leer el c贸digo QR:

Los dispositivos iOS son m谩s complicados: Apple ha
prohibido la distribuci贸n de aplicaciones de esta manera. Entonces los curiosos tendr谩n que construir la aplicaci贸n desde la
fuente en GitHub. Gracias por su atencion!