Перейти к содержанию

Экспортированный 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. Это не оставит места для интерпретации и четко сигнализирует о вашем намерении относительно видимости компонента.

Ссылки

  1. Экспортируемость компонентов

  2. About ContentProvider

К началу