2015年(9)
分类: Android平台
2015-04-22 19:45:04
关于Broadcast Receiver的安全保护主要有三个方面:
1、只让自己程序内部的Broadcast Receiver接收广播
2、只接收自己程序内部的组件发送的广播
3、确保自己的广播安全(不被拦截,不被修改)
先看第一个方面:只让自己程序内部的Broadcast Receiver组件接收广播,而禁止其它应用程序(通常是恶意软件)中的Broadcast Receiver接收。
要实现这一点,可以通过以下两种方式实现:
1、在发送广播时指明要Broadcast Receiver的类名,如下图未注释代码所示(这样的话目前来说应该就是很安全了,只有自己程序的Broadcast Receiver能接收到广播)。如果只写了被注释的那一行的话就存在被监听的安全隐患(只要恶意软件设置个action相同的Broadcast Receiver并得到相应的权限即可)。
2、还可以通过权限设置来实现,如下图所示:
如果在恶意软件中没有声明这一权限的话,它是接收不到广播信息的。
再看第二个方面,要实现这一点,可以通过为broadcast receiver设置自定义权限来实现,只有声明了该权限的组件发送的广播才能被接收。如下图所示:
第三个方面的话,是要保护自己的广播不被恶意终止或篡改。这要分两种情况来讨论:
1、广播通过sendBroadcast()方法发送,这种广播是不会被abortBroadcast()方法终止的,所以不用担心被恶意终止。至于恶意篡改的话,只要严格遵守第一方面中的方法1,也就不存在这个担忧了。
2、广播通过sendOrderedBroadcast()方法发送,通过该方法发送的广播,会先被优先级高的Broadcast Receiver接收,然后依次被优先级低的Broadcast Receiver接收。这就存在广播被篡改或终止的可能(恶意软件可以动态注册一个优先级高的Broadcast Receiver)。但是,只要严格遵守第一方面中的方法1,同样的,也就不存在这个担忧了,因为只有本程序内的Broadcast Receiver能够接收到广播。
PS:在安卓3.1之后,处于安全考虑,对Broadcast
Receiver作出了一些限制(总的来说,要想利用广播来搞破坏还是比较困难的,效果不是很明显):
1、只有至少被启动过一次的程序中的Broadcast Receiver才能收到广播(广播intent中设置了FLAG_INCLUDE_STOPPED_PACKAGES标志位的除外)
2、被强制杀死(用户手动、360等)的程序,只有再次启动后,其中的Broadcast Receiver才能再次接收到广播(广播intent中设置了FLAG_INCLUDE_STOPPED_PACKAGES标志位的除外)
相关的还有一个相反的标志位叫FLAG_EXCLUDE_STOPPED_PACKAGES,这两个标志位的官方解释如下图所示: