Почему контент-провайдер без разрешений и с 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 значение (что становится сложным).

ИМХО, весь этот раздел нужно переписать. Но, что касается вашего теста, экспортированный поставщик без разрешений широко открыт, и любое приложение может безнаказанно читать и писать.

Другие вопросы по тегам