关于BroadCastReceiver安全性的思考
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于BroadCastReceiver安全性的思考BroadCastReceiver是Android 四⼤组件之⼀,应⽤⾮常⼴泛,也⾮常简单,但是我们平时在使⽤的过程中忽略了⼀
个安全问题。
别⼈很容易通过反编译获取到我们应⽤中的⼴播,然后频繁的向你的App中发送⼴播,这个当然是我们不想看到的现象,那么如何避免应⽤中注册的⼴播响应其他应⽤发送的⼴播呢?在解决这个问题之前,我们先来了解⼀下如何发送⼀个⼴播。
在Android中发送⼀个⼴播通常有两种⽅式:显⽰和隐式
显式:
[java]
1. Intent intent=new Intent(this,MyBroadCastReceiver.class);
2. this.sendBroadcast(intent);
Intent intent=new Intent(this,MyBroadCastReceiver.class);
this.sendBroadcast(intent);
所谓显⽰,就是通过制定你要发送的哪个⼴播,如上例中的MyBroadCastReceiver这个⼴播
隐式:
[java]
1. Intent intent=new Intent("com.demo.action");
2. this.sendBroadcast(intent);
Intent intent=new Intent("com.demo.action");
this.sendBroadcast(intent);
所谓隐式就是通过action来匹配⼴播,对于匹配成功的⼴播就会响应
对于显⽰的⼴播除⾮是别⼈故意攻击,⼀般很少出现响应别⼈的⼴播,但是对于隐式的⼴播就很容易出现上述问题,因为action很容易是⼀样的,⼀旦是⼀样的就出问题了。
下⾯就来提出解决⽅案:
第⼀种⽅案:
在⾃⼰的应⽤中,在manifest.xml中注册receiver的时候加⼊export属性,如下:
[html]
1. <receiver android:name="com.baroad.demo.MyBroadCastReceiver" android:exported="false">
2. <intent-filter >
3. <action android:name="com.demo.action"/>
4.
5. </intent-filter>
6. </receiver>
<receiver android:name="com.baroad.demo.MyBroadCastReceiver" android:exported="false">
<intent-filter >
<action android:name="com.demo.action"/>
</intent-filter>
</receiver>
加⼊这个属性之后,这个⼴播不会响应外部⼴播的
第⼆种⽅案:
⾃定义权限,在manifest.xml中加⼊⾃定义权限,然后再响应的BroadCastReceiver中加⼊这个权限即可
[html]
1. <permission
2. android:name="com.yzy.permission.STARTBROAD"
3. android:protectionLevel="normal">
<permission
android:name="com.yzy.permission.STARTBROAD"
android:protectionLevel="normal">
然后将上⾯的权限注册到BroadCastReceiver
[html]
1. <receiver android:name="com.baroad.demo.MyBroadCastReceiver" android:permission="com.yzy.permission.STARTBROAD">
2. <intent-filter >
3. <action android:name="com.demo.action"/>
4.
5. </intent-filter>
6. </receiver>
<receiver android:name="com.baroad.demo.MyBroadCastReceiver" android:permission="com.yzy.permission.STARTBROAD">
<intent-filter >
<action android:name="com.demo.action"/>
</intent-filter>
</receiver>
第三种⽅案:
前⾯两种⽅案都是在接收⼴播的地⽅设置,第三种是在发送⽅便的地⽅设置,设置你的⼴播对哪个报名有效
[java]
1. Intent intent=new Intent("com.demo.action");
2. intent.setPackage("com.two.demo");
3. this.sendBroadcast(intent);
Intent intent=new Intent("com.demo.action");
intent.setPackage("com.two.demo");
this.sendBroadcast(intent);
第四种⽅案:
使⽤LocalBroadcastManager来实现⼴播
[java]
1. private LocalBroadcastManager mLocalBroadcastManager;
2. private BroadcastReceiver mReceiver;
private LocalBroadcastManager mLocalBroadcastManager;
private BroadcastReceiver mReceiver;
[java]
1. @Override
2. protected void onCreate(Bundle savedInstanceState)
3. {
4. super.onCreate(savedInstanceState);
5. setContentView(yout.activity_main);
6.
7. IntentFilter filter = new IntentFilter();
8. filter.addAction("com.demo.action");
9.
10. mReceiver = new MyBroadCastReceiver();
11. mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
12. mLocalBroadcastManager.registerReceiver(mReceiver, filter);
13. }
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(yout.activity_main);
IntentFilter filter = new IntentFilter();
filter.addAction("com.demo.action");
mReceiver = new MyBroadCastReceiver();
mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
mLocalBroadcastManager.registerReceiver(mReceiver, filter);
}
[java]
1. public void start(View view)
2. {
3. mLocalBroadcastManager.sendBroadcast(new Intent("com.demo.action"));
4. }
public void start(View view)
{
mLocalBroadcastManager.sendBroadcast(new Intent("com.demo.action"));
}
[java]
1. @Override
2. protected void onDestroy() {
3. mLocalBroadcastManager.unregisterReceiver(mReceiver);
4. super.onDestroy();
5. }
@Override
protected void onDestroy() {
mLocalBroadcastManager.unregisterReceiver(mReceiver);
super.onDestroy();
}
好了,就介绍到这⾥吧,通过以上四种⽅案,就可以避免⾃⼰的应⽤程序响应其他应⽤的⼴播。