Android让你发送的"广播"更加安全

前言:今天我们老大跑过来,说我们的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中的广播加上权限吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值