我可以使用`intent.setClassName()`来限制广播发送吗?

时间:2013-11-19 03:33:04

标签: android security android-intent

我正在发送如下的广播:

Intent intent = new Intent();
intent.setAction(com.test.CHANGE_MESSAGE_COUNT);
intent.putExtra("count", 1);
context.sendBroadcast(intent);

但有人说我遇到了一些安全问题,我应该使用intent.setClassName,这样我的意图就不会被劫持。

所以我修改了我的代码,添加了一行:

Intent intent = new Intent();
intent.setAction(com.test.CHANGE_MESSAGE_COUNT);
intent.setClassName(context, "NotExistingClass");
intent.putExtra("count", 1);
context.sendBroadcast(intent);

我发现即使我设置了一个从未存在的类名,我仍然可以收到广播,这意味着我的意图仍然可能被劫持。

所以我想知道我的代码是否有问题,或setClassName只能用于启动活动但不能用于发送广播?

2 个答案:

答案 0 :(得分:2)

我认为您正在寻找Intent.setPackage(),这会将可以接收广播的应用限制为拥有该套餐名称。

[编辑]如果您在接收方所在的广播过程中进行广播,也请考虑使用LocalBroadcastManager

答案 1 :(得分:0)

您可以使用LocalBroadcastManager来解决此问题。我列出了关于这个类的google开发文档中的descpritons: 帮助程序注册并向您的进程中的本地对象发送Intent广播。您知道您正在播放的数据不会离开您的应用,因此无需担心泄露私人数据。 其他应用程序无法将这些广播发送到您的应用程序,因此您无需担心他们可以利用安全漏洞。 它比通过系统发送全球广播更有效。