【问题标题】:Testing that BroadcastReceiver does not receive protected broadcast测试 BroadcastReceiver 没有收到受保护的广播
【发布时间】:2015-10-23 22:31:09
【问题描述】:

我会尽量概述这个场景。主要问题是:如何动态声明 2 个接收器,它们都接收相同的广播,但只有一个具有正确的接收权限?到目前为止,在我的测试中,两个接收器都收到了广播,因为我的应用程序持有声明的权限,而不仅仅是一个。

在应用程序 A 中,我正在发送一个我正在使用我定义的新权限保护的广播。

在 App B 中,我想确保来自 App A 的广播实际上受到保护。所以我动态地为同一个IntentFilter 声明了两个接收者,一个持有新权限,一个没有。但是,在 App B 的清单中,我当然声明了<uses-permission android:name="new permission" />

但是,两个接收者都得到了它,而不仅仅是持有许可的那个。我认为这是因为 App B 本身被声明为使用该权限。这是我的代码:

应用 A 清单:

<permission
    android:name="com.my.custom.permission"
    android:label="my_permission"
    android:protectionLevel="signature" />

应用 A 来源:

Intent intent = new Intent(SOME_CUSTOM_ACTION);
...
sendBroadcast(intent, "com.my.custom.permission");

应用 B 清单:

<uses-permission android:name="com.my.custom.permission" />

App B 服务:

private BroadcastReceiver rNoPermission = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (SOME_CUSTOM_ACTION.equals(intent.getAction())) {
            Log.d(TAG, "receiver was able to receive without permission");
        }
    }
};

private BroadcastReceiver rYesPermission = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (SOME_CUSTOM_ACTION.equals(intent.getAction())) {
            Log.d(TAG, "receiver was able to receive properly with permission");
        }
    }
};

public void start() {
    IntentFilter filter = new IntentFilter(SOME_CUSTOM_ACTION);
    registerReceiver(rNoPermission, filter); // purposely don't register with permission
    registerReceiver(rYesPermission, filter, "com.my.custom.permission", null);
}

public void end() {
    unregisterReceiver(rNoPermission);
    unregisterReceiver(rYesPermission);
}

流程:

  1. 为 Android 安装应用 A 以获取新权限
  2. 应用 B 已安装并运行
  3. App B start() 方法被调用
  4. 切换到 App A 触发发送广播
  5. 在日志中查看BroadcastReceivers 都被调用
  6. 调用end()方法结束测试

有什么想法吗?

【问题讨论】:

    标签: android broadcastreceiver android-broadcast


    【解决方案1】:

    意识到我的错误在哪里。权限是在应用程序级别授予的,而不是在组件级别授予的。根据 Android 文档:

    要在发送时强制执行权限,请向sendBroadcast(Intent, String)sendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handler, int, String, Bundle) 提供非空权限参数。只有被授予此权限的接收者(通过在其 AndroidManifest.xml 中使用标签请求)才能接收广播。

    (来源:http://developer.android.com/reference/android/content/BroadcastReceiver.html

    和:

    意图的发送者可以通过方法调用验证接收者是否具有指定非 Null 权限的权限。只有具有该权限的应用程序才会收到意图。

    (来源:http://developer.android.com/training/articles/security-tips.html

    因此,到目前为止,如果不将 BroadcastReceivers 拆分为 2 个单独的应用程序,一个使用权限,一个不使用权限,似乎没有办法执行我上面提到的操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-31
      • 2022-10-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2015-03-11
      相关资源
      最近更新 更多