jueves, 14 de junio de 2012

Permisos en Android



Permisos en Android

 |  | 4 Comentarios
Hoy en día, las aplicaciones de cualquier entorno (web, escritorio, móvil) piden la autorización explícita de los usuarios para accesar a determinada información que puede resultar delicada para el usuario.
En Android, las aplicaciones también requieren de permisos para leer y escribir sobre la información contenida en el dispositivo. El sistema de permisos de Android resulta útil en escenarios “simples” como el manejo de la información de contactos, hasta el uso más complejo de content providers y servicios que requieran de información suministrada de fuentes externas al dispositivo, sobre todo de Internet dónde el escenario de ataques es más amplio.
Nosotros, como Android developers, debemos asegurarnos de que nuestras aplicaciones tienen los permisos adecuados para hacer lo que queramos con la información de otras aplicaciones. De la misma forma, podemos definir permisos para las otras aplicaciones que en determinado momento necesiten consultar nuestra información o servicios, esto claro si decidimos hacerlos disponibles desde otros componentes de Android.

Pidiendo permiso a otras aplicaciones o servicios
Para poder utilizar la información o servicios de otras aplicaciones hacemos uso del famoso archivo AndroidManifest.xml en dónde definiremos un elemento <uses-permission>. Podemos tener cero o muchos elementos de este tipo, definiéndolos todos como hijos directos del elemento raíz del archivo.
El elemento <uses-permission> requiere de la definición de un solo atributo,android:name, dentro del cual definimos el nombre del permiso que requiere nuestra aplicación. Por ejemplo:
<uses-permission android:name=”android.permission.ACCESS_LOCATION” />
Todos los permisos del sistema empiezan con android.permission y se enumeran en ladocumentación oficial del SDK para la clase Manifest.permission. Las aplicaciones de terceros pueden tener sus propios permisos, para los casos en los que deberás consultar su documentación para poder utilizarlos dentro de tus aplicaciones Android. De forma general te describo brevemente algunos de los permisos más utilizados:
  • ACCESS_WIFI_STATE. Le permite a nuestras aplicaciones accesar a la información de las conexiones WI-FI.
  • INTERNET. En caso de que nuestra aplicación desee accesar a Internet para descargar algún dato o para hacer uso de un widget WebView deberemos utilizar este permiso.
  • READ_CALENDAR, READ_CONTACTS. Y todos los permisos con el prefijo READ_ le permiten a nuestras aplicaciones leer la información de los content providersincorporados en Android.
  • WRITE_CALENDAR, WRITE_CONTACTS. Y todos los permisos con el prefijo WRITE_ le permiten a nuestras aplicaciones modificar la información de los content-providersincorporados en Android.
Los permisos se confirman en el momento en que la aplicación se instala en el dispositivo. Para esto, se le pedirá al usuario su confirmación para que la aplicación pueda hacer uso de los permisos que necesita. Por lo tanto resulta importante que selecciones sólo los permisos que realmente necesita tu aplicación y justificar la petición para hacer más sencilla la instalación de la aplicación. Si te encuentras probando tus aplicaciones únicamente en el emulador del SDK, este mensaje no aparece, solamente cuando se requiere instalar en un dispositivo real.
Se puede dar el caso en el que no recibamos la autorización para hacer algo que necesita la aplicación, en los cuáles deberemos manejar una excepción de tipo SecurityExceptionque nos informará del permiso faltante, resaltando que no siempre podrá ser predecible. De todas formas hay que tomar en cuenta que los errores provocados por la falta de verificación de un permiso se dan únicamente si olvidamos pedirle el permiso al usuario; ya que resulta imposible que una aplicación se ejecute si no se le han otorgado los permisos necesarios.

Protegiendo el acceso a nuestras aplicaciones
El otro aspecto que hay que aprender de los permisos tiene que ver con la forma en la que protegeremos el acceso de otras aplicaciones hacia nuestra aplicación. Si nuestra aplicación se conforma únicamente de actividades y de intent receivers, se implementará la seguridad hacia afuera que abarca aspectos relacionados con las solicitudes para recibir el derecho de utilizar recursos de otras aplicaciones.
Si por el contrario, nuestra aplicación utiliza content providers y servicios, deberemos implementar la seguridad hacia adentro para controlar cuáles aplicaciones pueden hacer tal cosa con la información que consulten de nuestra aplicación.
Hasta este punto debemos tener claro que la cuestión de seguridad no va tanto enfocada hacia el hecho de que otras aplicaciones puedan estropear los datos, sino más bien sobre la privacidad de la información del usuario y del uso de servicios que podrían incurrir en gastos. Es aquí donde se concentran los permisos integrados en Android: si podemos leer o modificar los contactos del teléfono, mandar mensajes, etc. Hay que tener muy en claro si las aplicaciones que construyamos almacenarán información y en caso de que así sea, el grado de delicadeza que necesitan esos datos para analizar la estructura de seguridad prudente.
El primer paso para asegurar nuestras aplicaciones es definir los permisos dentro del archivo AndroidManifest.xml. En este caso, en lugar del elemento <uses-permission>utilizamos el elemento <permission> pues lo estamos definiendo. De nueva cuenta, podemos definir de cero a varios permisos, poniendo atención en que sean elementos hijos del elemento raíz del archivo.
La declaración de un permiso es un poco más complicado que usar un permiso. Para esto, necesitamos proporcionar tres datos:
  • El nombre simbólico del permiso. Para evitar que nuestro permiso coincida con el de alguna otra aplicación, se recomienda utilizar el espacio de nombres de las clases Java nuestra aplicación. Por ejemplo: com.androideity
  • Una etiqueta para el permiso. Un nombre corto que se entendible para el usuario.
  • Una descripción del permiso. Un texto un poco más extenso que sea entendible para el usuario.
Ejemplo:
Hay que mencionar que esta definición no forzará de ninguna forma a cumplir con el permiso. Por el contrario, lo único que hacemos es indicar que se trata de un posible permiso. Posteriormente, nuestra aplicación deberá marcar las violaciones de seguridad a medida que ocurran.
Existen dos formas para hacer que nuestra aplicación haga cumplir con los permisos definidos, dictando en dónde y bajo cuáles circunstancias son requeridos. Se puede hacer desde el código o en el manifiesto (que es la forma más sencilla).

Solicitar permisos de apps externas desde el AndroidManifest
Dentro de las actividades, los servicios y los intent receivers podemos definir un atributo llamado android:permission, cuyo valor es el nombre del permiso necesario para accesar a ese elemento. Por ejemplo:
De esta manera, sólo las aplicaciones que hayan solicitado el permiso indicado podrán accesar al componente de forma segura. En este contexto, el “acceso” se entiende como:
  • Las actividades no podrán ejecutarse sin el permiso.
  • Los servicios no podrán arrancarse, detenerse o vincularse a una actividad sin el permiso.
  • Los intent receivers ignorarán los mensajes enviados a través del métodosendBroadcast() a menos que el remitente tenga el permiso.
Los content providers ofrecen dos atributos distintos: readPermission ywritePermissioncomo se muestra a continuación:
En este ejemplo, android:readPermission controla el acceso para consultar al content provider, y android:writePermission controla el acceso para insertar, actualizar o borrar información en el content provider.

Solicitar permisos de apps externas desde el código
En el código Java, existen dos formas de asegurarnos de que las aplicaciones externas están solicitando los permisos necesarios:
  • Los servicios que utilices pueden verificar los permisos en función de cada llamada hecha al método checkCallingPermission(). Este método retornaPERMISSION_GRANTED o PERMISSION_DENIED, dependiendo de si la aplicación tiene el permiso o no. El valor que se le pasa como parámetro es el nombre del permiso que se quiere verificar.
  • Podemos incluir un permiso a la hora de llamar al método sendBroadcast(). De esta forma sólo los receptores con el permiso podrán recibir la información solicitada. Por ejemplo, el subsistema de Android incluye el permiso RECEIVE_SMS para saber cuando un nuevo mensaje ha sido recibido en el teléfono. De esta forma se restringe los receptores que pueden tener acceso a esta información.

Consideraciones extras
Para terminar este tema, tienes que saber que no existe un mecanismo que detecte los permisos que necesita la aplicación en tiempo de compilación; todas las fallas de los permisos se producen en tiempo de ejecución. Por lo tanto, es importante que documentes todos los permisos necesarios para utilizar alguna API pública que hayas creado, incluyendo los content providers, servicios y actividades que se requieren para que se puedan ejecutar otras actividades. De otra forma, los desarrolladores que intenten interactuar con tus aplicaciones deberá realizar una labor titánica sacrificando tiempo en descubrir los permisos que necesita.
De la misma forma, toma en cuenta que los usuarios más técnicos confirmarán que tu aplicación esté haciendo uso de los permisos que dijo necesitar. Así que trata de documentar muy bien los permisos de tal forma que los usuarios entiendan qué tipo de aplicación están instalando para que no se sientan vulnerables a alguna aplicación maliciosa.

Este es un tema fascinante y que debes de dominar al 100% si quieres crear aplicaciones robustas y con una gama de funciones interesantes. Espero que te haya sido de utilidad la información.

FUENTE: http://androideity.com  sitio web muy recomendable para Aprender Android, como usuario o developer.

No hay comentarios:

Publicar un comentario