本文主要是介绍BroadcastReceiver与自定义权限 -- 网络安全,BroadcastReceiver私有化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
BroadcastReceiver组件的注册方式可分为两种,一种是静态注册,即提前在AndroidManifest.xml
文件中声明组件;另外一种是动态注册,即在代码中使用registerReceiver()方法注册
BroadcastReceiver,只有当registerReceiver()的代码执行到了才进行注册,取消时则调用
unregisterReceiver()方法。而容易被忽略的是registerReceiver()方法注册的是全局
BroadcastReceiver,在其生命周期里是默认可导出的,如果没有指定权限访问控制,可以被任意
外部应用访问,向其传递Intent来执行特定的功能。因此,动态注册的BroadcastReceive可能导致
拒绝服务攻击、应用数据泄漏或是越权调用等风险。
解决方法:
https://www.jianshu.com/p/a0e47c64027d
https://blog.csdn.net/javensun/article/details/7334230
在Android应用开发中,有时会遇到以下两种情况,
1. 一些敏感的广播并不想让第三方的应用收到 ;
2. 要限制自己的Receiver接收某广播来源,避免被恶意的同样的ACTION的广播所干扰。
在这些场景下就需要用到广播的权限限制。
第一种场景: 谁有权收我的广播?
在这种情况下,可以在自己应用发广播时添加参数声明Receiver所需的权限。
首先,在Androidmanifest.xml中定义新的权限RECV_XXX,例如:
<permission android:name = "com.android.permission.RECV_XXX"/>
然后,在Sender app发送广播时将此权限作为参数传入,如下:
sendBroadcast("com.android.XXX_ACTION", "com.android.permission.RECV_XXX");
这样做之后就使得只有具有RECV_XXX权限的Receiver才能接收此广播要接收该广播,在Receiver应用的AndroidManifest.xml中要添加对应的RECV_XXX权限。
例如:
<uses-permission android:name="com.android.permission.RECV_XXX"></uses-permission>
第二种场景: 谁有权给我发广播?
在这种情况下,需要在Receiver app的<receiver> tag中声明一下Sender app应该具有的权限。
首先同上,在AndroidManifest.xml中定义新的权限SEND_XXX,例如:
<permission android:name="com.android.SEND_XXX"/>
然后,在Receiver app的Androidmanifest.xml中的<receiver>tag里添加权限SEND_XXX的声明,如下:
<receiver android:name=".XXXReceiver"android:permission="com.android.permission.SEND_XXX"><intent-filter><action android:name="com.android.XXX_ACTION" /></intent-filter></receiver>
这样一来,该Receiver便只能接收来自具有该SEND_XXX权限的应用发出的广播。
要发送这种广播,需要在Sender app的AndroidManifest.xml中也声明使用该权限即可,如下:
<uses-permission android:name="com.android.permission.SEND_XXX"></uses-permission>
如此,可以用来对广播的来源与去处进行简单的控制。
同样,对Activity 和 ContentProvider的访问权限控制也类似。
这篇关于BroadcastReceiver与自定义权限 -- 网络安全,BroadcastReceiver私有化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!