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

时间:2017-01-27 18:02:50

标签: android android-contentprovider android-permissions

这是我试图了解Android内容提供商权限的测试:

App ProviderApp 清单:

<provider
    android:authorities="com.mycompany.myProviderApp"
    android:name="com.mycompany.myProviderApp.ContentProviderForMyOtherApps"
    android:exported="true"/>

我还使用基本ContentProvider方法实现了一个虚拟ContentProviderForMyOtherAppsquery),在 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#Permissions

  

机器人:导出

     

内容提供商是否可用于其他应用程序   use:true:提供程序可供其他应用程序使用。任何   应用程序可以使用提供程序的内容URI来访问它,主题   为提供者指定的权限。

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

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

(我在文档中遗漏了什么?)

1 个答案:

答案 0 :(得分:8)

文档有错误。这样:

  

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

应为:

  

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

恕我直言,整个部分需要重写。但是,对于您的测试,导出的无权限提供程序是敞开的,任何应用程序都能够读写而不受惩罚。