【问题标题】:Android ContentProvider find other URIsAndroid ContentProvider 查找其他 URI
【发布时间】:2015-04-14 14:45:42
【问题描述】:

我正在编写一个将查询其他应用程序的 ContentProviders 的应用程序。我遇到了一个问题,因为在给定 ProviderInfo 的情况下,我无法获取其他应用程序的 ContentProvider 的 URI。到目前为止,我有以下函数接收 ProviderInfo 对象,但我不知道如何找到它的可用 URI 进行查询。调用 provider.authority 是不够的,因为它没有指定要查询的后缀表名。其他应用程序能够做到这一点,例如 ContentProviderHelper (https://github.com/jenzz/ContentProviderHelper),但我无法完全找到他们在代码中是如何做到这一点的。

有人遇到过这种情况吗?

public String[] getContentProviderColumnNames(ProviderInfo provider){
    Uri u = Uri.parse("content://"+provider.authority);//How do i get the complete URI?

    ContentResolver resolver = getActivity().getContentResolver();
    //below fails of course because the URI is invalid
    Cursor c = resolver.query(u, null, null, null, null);

    //Todo: for each found uri (tablename), query it using getColumnName
    //Get column names
    int colCount = c.getColumnCount();
    String[] columnNames = new String[colCount];
    for (int i = 0; i<colCount; i++) {
        columnNames[i] = c.getColumnName(i);
    }
    return columnNames;
}

谢谢

【问题讨论】:

    标签: android android-contentprovider


    【解决方案1】:

    我正在编写一个将查询其他应用程序的 ContentProviders 的应用程序。

    这不太可能奏效,因为您对其他应用的提供商一无所知。您可以以这种方式访问​​的任何提供程序都表明其他应用程序存在安全漏洞,因为应通过适当的权限保护提供程序。

    我遇到了一个问题,因为在给定 ProviderInfo 的情况下,我无法获取其他应用程序的 ContentProvider 的 URI。

    正确。有效的Uri 值取决于提供者的实现,并且不可发现。

    其他应用程序可以做到这一点,例如 ContentProviderHelper (https://github.com/jenzz/ContentProviderHelper)

    不,他们不是。 Driller 先生的搜索机制正在猜测 Uri 值,使用与您问题中的代码 sn-p 相同的基本算法。没有要求提供者使用该 Uri 值,我希望很少有人会这样做。其余的是hard-coded

    【讨论】:

    • 感谢您解决了我对 ContentProviderHelper 的困惑。我的下一条评论是关于 Drozer 漏洞测试框架。我假设它必须通过在 ADB 上解析 dumpsys 来收集 ContentProvider URI。不过,你回答了我的问题,谢谢!
    • @behren:我还没有戳过 Drozer 看看它做了什么。当然,一个足够强大的反编译器可以推断出一些ContentProvider 实现使用的Uri 结构,但总的来说这是一个无限的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 2011-02-04
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    相关资源
    最近更新 更多