Экспортированный Content Provider
Описание
Как следует из названия, Content Provider, отвечает за предоставление данных и управление доступом к ним. Эти данные могут храниться в файловой системе, в базе данных SQLite или в любом другом постоянном хранилище, доступном из вашего приложения. С помощью Content Provider любое приложение с соответствующими разрешениями может читать или даже изменять данные, используя стандартный набор API, который позволяет выполнять необходимые транзакции.
Вы объявляете Content Provider в файле AndroidManifest.xml вашего приложения так же, как вы делаете это для Activity и других компонентов. Чтобы объявить свой Content Provider, добавьте элемент <provider>
как дочерний элемент <application>
:
<manifest ... >
...
<application ... >
<service android:name=".MyContentProvider" />
...
</application>
</manifest>
Одним из атрибутов ContentProvider является android:exported
, он определяет, может ли ContentProvider запускаться компонентами других приложений. Если значение атрибута равно true
, любое приложение может получить доступ к ContentProvider. Если значение false
, только компоненты одного и того же приложения, приложения с тем же идентификатором пользователя или привилегированные системные компоненты могут запускать этот ContentProvider.
Логика значения этого атрибута по умолчанию со временем менялась и различалась в зависимости от типов компонентов и версий Android. Например, на уровне API 16 (Android 4.1.1) или ниже атрибут android:exported
по умолчанию имеет значение true
. Если этот атрибут не задан явно, существует риск того, что на некоторых устройствах будут разные значения по умолчанию. А вот уже с версии API 31 (Android 12) требуется в обязательном порядке явно указывать значение атрибута android:exported
.
Проблема
Ситуация с разными значениями атрибута android:exported
по умолчанию означает, что вы можете случайно раскрыть внутренние компоненты приложения. Таким образом другие приложения неправомерно получают доступ к внутренним компонентам вашего приложения и может произойти утечка конфиденциальных данных или даже выполнение кода в контексте уязвимого приложения.
Рекомендации
Всегда явно устанавливайте атрибут android:exported
. Это не оставит места для интерпретации и четко сигнализирует о вашем намерении относительно видимости компонента.