Почему контент-провайдер без разрешений и с exported=true доступен для любого приложения?
Вот тест, который я провел, чтобы понять разрешения Android Content Provider:
App ProviderApp манифест:
<provider
android:authorities="com.mycompany.myProviderApp"
android:name="com.mycompany.myProviderApp.ContentProviderForMyOtherApps"
android:exported="true"/>
Я также реализовал манекен ContentProvider
(ContentProviderForMyOtherApps
) с основным query
метод, возвращающий строку в 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;
}
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!
Итак, все работает нормально, ClientApp успешно обращается к провайдеру.
Но мое понимание документации, основанной на приведенных ниже выдержках, заключается в том, что ClientApp должен был быть запрещен доступ к поставщику, потому что:
- У манифеста ProviderApp нет
android:readPermission
внутриprovider
(напримерcom.mycompany.myProviderApp.READ
) - У манифеста ClientApp нет соответствия
uses-permission
(напримерcom.mycompany.myProviderApp.READ
)
Выдержки из документации:
Если приложение провайдера не указывает никаких разрешений, то другие приложения не имеют доступа к данным провайдера.
https://developer.android.com/guide/topics/providers/content-provider-basics.html
андроид: экспортироваться
Доступен ли поставщик контента для использования другими приложениями: true: поставщик доступен для других приложений. Любое приложение может использовать URI контента провайдера для доступа к нему в соответствии с разрешениями, указанными для провайдера.
https://developer.android.com/guide/topics/manifest/provider-element.html
Почему этот код (провайдер и клиент заявляют, что нет разрешений) на самом деле работает?
(Что я пропустил в документации?)
1 ответ
В документации есть ошибка. Это:
Если приложение провайдера не указывает никаких разрешений, то другие приложения не имеют доступа к данным провайдера.
следует читать как:
Если в приложении провайдера не указаны какие-либо разрешения, то доступ других приложений к данным провайдера определяется исключительно
android:exported
значение (true
предоставляет неограниченный доступ ко всем приложениям;false
блокирует доступ другим приложениям) иandroid:grantUriPermissions
значение (что становится сложным).
ИМХО, весь этот раздел нужно переписать. Но, что касается вашего теста, экспортированный поставщик без разрешений широко открыт, и любое приложение может безнаказанно читать и писать.