Android广播的安全性

广播的分类

定义分类
  • 系统广播
    由Android系统内部自动发出,用户只负责接收
  • 自定义广播
    由开发者自己定义的广播
注册方式分类
  • 动态注册
    在代码中注册的
  • 静态注册
    动态注册要求程序必须在运行时才能进行,如果需要在程序还没启动的时候就可以接收到注册的广播,就需要静态注册了。主要是在AndroidManifest中进行注册
发送方式分类(只能是自定义广播)
  • 标准广播
    没有先后顺序可言,不能修改内容,无法被截断
  • 有序广播
    根据优先级依次向后传播,优先级相同时动态注册高于
    静态注册,abortBroadcast()可截断广播

广播的安全性

Android中的广播可以跨进程甚至跨App直接通信,可能会收到其他app发送的相同的自定义广播,也可能被其他app收到并获取其中信息。一些增加安全性的方案包括:
1. 静态注册自定义广播时 android:exported="false" 属性设置false,不接收其他App内部发出的此广播

2. 发送自定义广播时,intent.setPackage(packageName)指定包名,这样此广播将只会发送到此包中的App内与之相匹配的有效广播接收器中

3. 采用LocalBroadcastManager的方式直接发送本地广播

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("xxx");
localBroadcastManager = LocalBroadcastManager.getInstance(this); //获取实例
localBroadcastManager.registerReceiver(myBroadcastReceiver, intentFilter); //注册本地广播监听

localBroadcastManager.sendBroadcast(new Intent("xxx")); // 发送本地广播

localBroadcastManager.unregisterReceiver(myBroadcastReceiver);//退出时解除注册

注意:AndroidX废除了localBroadcastManager 直接使用Context的registerReceiver()、sendBroadcast()、unregisterReceiver() 进行注册、发送、解除

4. 在广播发送和接收时,都增加上permission,用于权限验证

4.1. 自己定义权限,并且使用自定义权限

<permission
    android:name="my.permission.name"
    android:label="BroadcastReceiverPermission"
    android:protectionLevel="signature">
</permission>
<uses-permission android:name="my.permission.name" />

android:protectionLevel属性如下:

  • normal:默认的,应用安装前,用户可以看到相应的权限,但无需用户主动授权。
  • dangerous:normal安全级别控制以外的任何危险操作。需要dangerous级别权限时,Android会明确要求用户进行授权。常见的如:网络使用权限,相机使用权限及联系人信息使用权限等。
  • signature:它要求权限声明应用和权限使用应用使用相同的keystore进行签名。如果使用同一keystore,则该权限由系统授予,否则系统会拒绝。并且权限授予时,不会通知用户。它常用于应用内部。把protectionLevel声明为signature。如果别的应用使用的不是同一个签名文件,就没办法使用该权限,从而保护了自己的接收者。

4.2. 如果采用静态注册的方式:

<receiver
     android:name=".common.MyBroadcastReceiver"
     android:exported="false"
     android:permission="my.permission.name">
     <intent-filter>
         <action android:name="action.name"/>
     </intent-filter>
</receiver>

4.3. 如果采用动态注册的方式:

//注册receiver时,指定发送者的权限,不然外部应用可以收到receiver
registerReceiver(receiver, intentFilter, "my.permission.name", null);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.广播的分类 (1)按照发送的方式分类 标准广播是一种异步的方式来进行传播的,广播发出去之后,所有的广播接收者几...
    曹丰斌阅读 34,301评论 0 22
  • 广播接收器 是Android的四大组件之一,可见广播在Android中的重要性; 1. 什么是广播? 广播(Bro...
    Lost_Robot阅读 2,073评论 2 10
  • 1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,Broadca...
    IT小魔女的故事阅读 631评论 0 2
  • 诸多无奈,最近在改一个项目的bug的时候,脑子老是一片空白,可能是最近脑子不够用,总之,好多东西忘了,阅读一些别人...
    狗子王1948阅读 7,863评论 6 53
  • 2.1 Activity 2.1.1 Activity的生命周期全面分析 典型情况下的生命周期:在用户参与的情况下...
    AndroidMaster阅读 3,302评论 0 8

友情链接更多精彩内容