为什么Content Provider没有权限,并且对任何应用程序都可以使用exported = true?

Séb*_*ien 6 android android-contentprovider android-permissions

这是我试图了解Android Content Provider权限的测试:

App ProviderApp清单:

<provider
    android:authorities="com.mycompany.myProviderApp"
    android:name="com.mycompany.myProviderApp.ContentProviderForMyOtherApps"
    android:exported="true"/>
Run Code Online (Sandbox Code Playgroud)

我还使用在ProviderApp中返回字符串的基本方法实现了一个dummy ContentProvider(ContentProviderForMyOtherApps):query

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;
}
Run Code Online (Sandbox Code Playgroud)

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!
Run Code Online (Sandbox Code Playgroud)

好的,所以一切正常,ClientApp成功访问提供程序.

但根据以下摘录,我对文档的理解是ClientApp应该被拒绝访问提供者,因为:

  • ProviderApp明显没有android:readPermissionprovider(如com.mycompany.myProviderApp.READ)
  • ClientApp清单没有匹配uses-permission(例如com.mycompany.myProviderApp.READ)

文档摘录:

如果提供者的应用程序未指定任何权限,则其他应用程序无权访问提供者的数据.

https://developer.android.com/guide/topics/providers/content-provider-basics.html#Permissions

机器人:出口

内容提供程序是否可供其他应用程序使用:true:提供程序可供其他应用程序使用.任何应用程序都可以使用提供程序的内容URI来访问它,具体取决于为提供程序指定的权限.

https://developer.android.com/guide/topics/manifest/provider-element.html

为什么这段代码(提供者和客户端声明NO权限)实际上有效?

(文档中我错过了什么?)

Com*_*are 10

文档有一个错误.这个:

如果提供者的应用程序未指定任何权限,则其他应用程序无权访问提供者的数据.

应该读作:

如果提供者的应用程序未指定任何权限,则其他应用程序对提供者数据的访问仅由android:exported值(true授予对所有应用程序的无限访问权限; false阻止其他应用程序访问)和android:grantUriPermissions值(变得复杂)决定.

恕我直言,整个部分需要重写.但是,就您的测试而言,一个导出的无权限提供程序是开放的,任何应用程序都可以读取和写入而不受惩罚.