前言:今天我们老大跑过来,说我们的app中出现了安全漏洞,我顿时懵逼了,在安全软件的监测下,说是动态注册了一个没有权限的广播,唉唉!!以前在外包呆久了,然而只负责快速实现功能,完全没有考虑安全性啊,于是就准备给广播加加权限,没想到一路遇到坑啊~~~~
我这里创建了两个app,一个A,一个B。
首先我们在app A中去注册一个广播
一般朋友都会向我这样写,很快,很爽!:
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String name=intent.getStringExtra("data");
Log.e("TAG", onReceive: ----->+name );
}
},new IntentFilter(com.yqy));
然后我们在app B中去发一个广播:
Intent intent=new Intent("com.yqy");
intent.putExtra("data","yqy");
sendBroadcast(intent);
是不是很快就搞定了?(^__^) 嘻嘻……然后我们运行app A跟app B,然后点击app B中的发送广播按钮:
11-22 21:23:59.763 4208-4208/com.cisetech.animationdemo E/TAG: onReceive: ----->yqy
我们可以看到,有log打印出来了,这样也太不安全了哈…..怪不得安全软件会检测出来,于是我们改改代码:
在app A中注册一个有权限的广播接收器:
/**
*
* @param receiver 广播接收器
* @param filter 过滤器
* @param broadcastPermission 广播权限
* @param scheduler 接收到广播后在什么线程中处理,如果为null的话就在主线程中处理
* @return
*/
public Intent registerReceiver(
BroadcastReceiver receiver, IntentFilter filter,
String broadcastPermission, Handler scheduler) {
return mBase.registerReceiver(receiver, filter, broadcastPermission,
scheduler);
}
于是我们app A中的代码改为:
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String name=intent.getStringExtra("data");
Log.e("TAG", "onReceive: ----->"+name );
}
},new IntentFilter("com.yqy"),"com.cn.customview.permissions.MY_BROADCAST",null);
然后我们运行app B,发送一个广播;
结果不管我们怎么发送,app A中都不会收到广播了,why?因为我们的app A中注册广播的时候,使用了权限,如果app B中发送的广播app A中需要接收到的话,app B中必须去声明权限:
于是我们改改app B中maninfest.xml文件,加上权限声明:
<uses-permission android:name="com.cn.customview.permissions.MY_BROADCAST">uses-permission>
我们再次运行app B发送一条广播:
11-22 21:46:19.160 21935-21935/com.cisetech.animationdemo E/TAG: onReceive: ----->yqy
我们看到了log中打印的内容,那小伙伴又疑问了,如果我app B发送的广播也需要加权限,有我权限的app才能接受到怎么办呢?
于是我们修改一下app B中发送广播的方式:
Intent intent=new Intent("com.yqy");
intent.putExtra("data","yqy");
sendBroadcast(intent,"com.cn.customview.permissions.MY_BROADCAST");
app B中发送了一条带权限的广播,我们再次运行app B,然后发送一条带权限的广播:
不管我们怎么操作,app A中始终没有接收到广播,这时机智的你肯定知道什么原因了,因为我们已经被坑了一次了O(∩_∩)O哈哈~
于是有了上一次的经验,我们同时在app A中修改一下app A的maninfest.xml文件:
<uses-permission android:name="com.cn.customview.permissions.MY_BROADCAST" />
同样加上了接受此广播的权限,然后我们重新运行app A,我们再次向app A中发送一条广播:
11-22 21:46:19.160 21935-21935/com.cisetech.animationdemo E/TAG: onReceive: ----->yqy
我们成功的看到了log的打印!!!
动态的广播都知道怎么去设置权限了,静态的就soeasy了哈!!! 我就不演示了。
我顺便又尝试了一下给一个app A中的一个Activity设置一个action然后把它的android:exported=”true”设置成了true:
<permission android:name="com.cisetech.animationdemo.test" android:protectionLevel="normal"/>
<activity android:name=".demo.InterpolatorActivity3_test"
android:exported="true"
android:permission="com.cisetech.animationdemo.test"
>
<intent-filter>
<action android:name="com.yqy"/>
<category android:name="android.intent.category.DEFAULT"/>
intent-filter>
activity>
一定要记住了,如果想让这个Activity能被其他应用访问,一定要加action跟category :
<action android:name="com.yqy"/>
<category android:name="android.intent.category.DEFAULT"/>
有了前面广播的经验,我们一定要在app B中去显示的说明下需要用到的权限:
<uses-permission android:name="com.cisetech.animationdemo.test">uses-permission>
然后创建一个隐式的intent:
Intent intent=new Intent();
intent.setAction("com.yqy");
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(intent);
这两个是必须要加的,不然会报找不到此action的Activity错误:
intent.setAction("com.yqy");
intent.addCategory(Intent.CATEGORY_DEFAULT);
好啦!!!!小伙伴们,赶紧给你的app中的广播加上权限吧~