9

我没有找到要求与我相同的限制的帖子。

我有一个应用程序,它为其他应用程序(称为客户端应用程序)提供内容提供程序(称为主应用程序)。我想限制从客户端应用程序对内容提供者的访问,以仅支持插入查询方法。

我不想要的:

  • 将内容提供者设为私有,因为主要目标是为客户端应用程序提供数据库。
  • 使用客户端应用程序的签名限制访问,因为任何人都必须能够编写使用主应用程序平台的客户端应用程序。

我看到的最明显的解决方案是编写两个内容提供程序,一个具有主应用程序的完全访问私有,一个受限制的公共。但我认为这绝对不是正确的方法。

根据这个Google groups post,我正在考虑Binder.getCallingUid()在内容提供者调用中使用来检测调用是否来自主应用程序。因此,如果调用不是来自主应用程序,我在更新删除方法中无能为力。

如何获取主应用程序UID进行比较?如果可能的话,这个解决方案是否安全?

谢谢你的建议。

4

1 回答 1

9

使用 protectionLevel 签名定义如下所示的权限,此 WRITE 权限将仅限于使用相同私钥签名的应用程序

<permission android:name="com.yourapp.WRITE.PERMISSION"
    android:protectionLevel="signature"
        android:label="@string/permission_label"
        android:description="@string/permission_desc">
</permission>

<permission android:name="com.yourapp.READ.PERMISSION"
        android:label="@string/permission_label"
        android:description="@string/permission_desc">
</permission>

然后在 contentprovider 标签中使用读写权限标签。您可以强制执行读取权限,也可以完全删除它

android:readPermission="com.yourapp.READ.PERMISSION"
android:writePermission="com.yourapp.WRITE.PERMISSION"

因此,只有由相同签名签名的应用才能使用您的内容提供商

编辑:

也许你可以用这个

 private Collection<String> getCallingPackages() {
     int caller = Binder.getCallingUid();
     if (caller == 0) {
         return null;
     }
     return Lists.newArrayList(mContext.getPackageManager().getPackagesForUid(caller));
 }

并检查您的包名是否出现在此列表中。我认为这是安全的

于 2012-08-31T09:56:44.617 回答