Android 内容提供程序 - 是不是可以将提供程序限制为一组不是我编写的应用程序?

Posted

技术标签:

【中文标题】Android 内容提供程序 - 是不是可以将提供程序限制为一组不是我编写的应用程序?【英文标题】:Android Content Providers - Is it possible to restrict the provider to a set of applications not written by me?Android 内容提供程序 - 是否可以将提供程序限制为一组不是我编写的应用程序? 【发布时间】:2012-02-03 16:56:35 【问题描述】:

谈到保护内容提供商时,我想知道在正常权限级别安全性和签名级别安全性之间是否存在一个步骤。

我有一个使用提供程序的应用程序,我想向一组特定的其他应用程序公开。但是,那些选择的其他应用程序不会由我编写,因此使用签名级别的权限是不够的,因为签名会有所不同。

另外,如果我对提供者使用正常权限,并且如果消费应用程序没有该权限并引发 SecurityException,则记录的异常会显示所需权限的名称,因此消费应用程序可以简单地添加该权限到其 Manifest 并获得访问权限以规避许可。

有没有办法只允许其他应用程序在运行时访问提供程序?

谢谢。

【问题讨论】:

权限系统并非旨在成为一种许可机制,这听起来就像您在这里尝试做的那样。 我就是这么想的。我只是想知道是否可以这样使用权限,但我想不是。 如果您正在寻找不可能的真正安全性:security.stackexchange.com/questions/826/… 【参考方案1】:

我不太清楚,但我认为您可以在 ContentProvider 中使用 Binder.getCallingUid() 函数。使用此方法,您可以检查调用应用程序的 Uid,并根据应用程序 UID 限制您的 CP 的使用。

更新: 在安装过程中,android 操作系统会为安装应用程序分配 UID。因此,不同设备上的 UID 可能不同。但是应用程序的包名称在所有设备上都是相同的。但是如果我知道哪个包可以读取你的数据,我可以简单地欺骗它。

【讨论】:

你知道UID是怎么确定的吗?是随机生成的吗?它会因设备而异吗?谢谢。 没有Binder 用于ContentProvider,AFAIK。【参考方案2】:

我想到的一个解决方案可能是将您的内容提供者包装在服务中。这种方式查询是通过意图或通过活页夹来实现的。您可以通过检查包名称来限制意图,我认为如果该应用来自应用市场,则更难伪造。

我认为你在问不可能的事。任何对这种安全性的尝试都可以在有根手机上被规避。

【讨论】:

以上是关于Android 内容提供程序 - 是不是可以将提供程序限制为一组不是我编写的应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

未调用内容提供程序查询()(Android TV)

Android-Android内容提供器之访问其他程序的数据

处理 Android 自定义内容提供程序中的(跨进程)异常

Android 跨程序共享数据,探究内容提供器

5Android-跨程序共享数据--内容提供器

android第一行代码-9.内容提供器