Chinaunix首页 | 论坛 | 博客
  • 博客访问: 58762
  • 博文数量: 9
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 164
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-04 18:49
文章分类
文章存档

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,这两个标志位的官方解释如下图所示:





   题外话:本来想放工程的,但是觉得这个地方利用价值不大,而且也很难逃过360的内存清理(这个问题纠结了好久,为什么呢,因为一旦你的程序被360的内存清理给杀掉了,就会进入stopped的状态,如果用户不手动启动的话,就没有办法再监听广播了,会带来很大的不方便,请大家给一些有效的方案~~~),所以就不传工程了~


阅读(1082) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~