¿Por qué el proveedor de contenido sin permisos y exportado = true es accesible para cualquier aplicación?
Aquí hay una prueba que corrí para entender los permisos de Android Content Provider:
App ProviderApp manifest:
- La aplicación se bloquea con SecurityException en Android M
- BroadcastReceiver SMS_Received no funciona en nuevos dispositivos
- Editar o eliminar el permiso de la página de información de la aplicación mientras se instala la aplicación
- No se puede comprobar permisos en fragmento con Sdk 23?
- Boot BroadcastReceiver no funciona en los dispositivos Xiaomi
<provider android:authorities="com.mycompany.myProviderApp" android:name="com.mycompany.myProviderApp.ContentProviderForMyOtherApps" android:exported="true"/>
También implementé un dummy ContentProvider
( ContentProviderForMyOtherApps
) con un método de query
básica que devuelve una cadena en ProviderApp :
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { String[] cols = {"column1"}; MatrixCursor cursor = new MatrixCursor(cols); MatrixCursor.RowBuilder builder = cursor.newRow(); builder.add("HELLO!"); return cursor; }
Código de App ClientApp :
Cursor cursor = getContentResolver().query(Uri.parse("content://com.mycompany.myProviderApp"),null,null,null,null); cursor.moveToFirst(); Log.d(TAG, cursor.getString(0)); // output: HELLO!
Bueno, así que todo funciona bien, ClientApp accede al proveedor con éxito.
Pero mi comprensión de la documentación, basada en los extractos siguientes, es que ClientApp debería haber sido negado el acceso al proveedor, porque:
- ProviderApp manifiesto no tiene
android:readPermission
dentro delprovider
(por ejemplo,com.mycompany.myProviderApp.READ
) - El manifiesto de ClientApp no tiene
uses-permission
correspondientes (por ejemplo,com.mycompany.myProviderApp.READ
)
Extractos de la documentación:
Si la aplicación de un proveedor no especifica ningún permiso, otras aplicaciones no tienen acceso a los datos del proveedor.
Https://developer.android.com/guide/topics/providers/content-provider-basics.html#Permissions
Androide: exportado
Si el proveedor de contenido está disponible para otras aplicaciones para usar: true: El proveedor está disponible para otras aplicaciones. Cualquier aplicación puede usar el URI de contenido del proveedor para acceder a él, sujeto a los permisos especificados para el proveedor.
Https://developer.android.com/guide/topics/manifest/provider-element.html
¿Por qué este código (proveedor y cliente que declaran NO permisos) realmente funciona?
(¿Qué he perdido en la documentación?)
- Comunicación con el servidor sin permiso de Internet
- Mostrar explicación de permiso de forma asincrónica
- Ventana de superposición del sistema Android
- El permiso personalizado de Android falla según el pedido de instalación de la aplicación
- SYSTEM_ALERT_WINDOW - Cómo obtener este permiso automáticamente en Android 6.0 y targetSdkVersion 23
- Android marshmallow solicitud de permiso?
- ¿Puedo recibir los intentos C2DM de otra aplicación de Android si estoy firmado con la misma firma?
- ¿Cómo uso la concesión de adb o la revocación de adb?
La documentación tiene un error. Esta:
Si la aplicación de un proveedor no especifica ningún permiso, otras aplicaciones no tienen acceso a los datos del proveedor.
Debe leerse como:
Si la aplicación de un proveedor no especifica ningún permiso, el acceso de otras aplicaciones a los datos del proveedor se determina únicamente por el valor
android:exported
(true
concede acceso ilimitado a todas las aplicaciones, el acceso a bloquesfalse
por otras aplicaciones) yandroid:grantUriPermissions
value (Que se complica).
IMHO, esa sección entera tiene que ser reescrito. Pero, con respecto a su prueba, un proveedor sin permisos exportado está abierto, con cualquier aplicación capaz de leer y escribir con impunidad.
- En android sdk1.5 donde encontrar mi Sqlite Db en mi sistema
- Función de actualización en android SQLite no funciona