关于BroadCastReceiver安全性的思考

尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38948863

BroadCastReceiver是Android 四大组件之中的一个,应用非常广泛。也非常简单,可是我们平时在使用的过程中忽略了一个安全问题。

别人非常easy通过反编译获取到我们应用中的广播,然后频繁的向你的App中发送广播,这个当然是我们不想看到的现象,那么怎样避免应用中注冊的广播响应其它应用发送的广播呢?在解决问题之前。我们先来了解一下怎样发送一个广播。


在Android中发送一个广播通常有两种方式:显示和隐式

显式:

Intent intent=new Intent(this,MyBroadCastReceiver.class);
    this.sendBroadcast(intent);

所谓显示,就是通过制定你要发送的哪个广播。如上例中的MyBroadCastReceiver这个广播

隐式:

Intent intent=new Intent("com.demo.action");
    this.sendBroadcast(intent);

所谓隐式就是通过action来匹配广播,对于匹配成功的广播就会响应


对于显示的广播除非是别人有益攻击。一般非常少出现响应别人的广播,可是对于隐式的广播就非常easy出现上述问题。由于action非常easy是一样的,一旦是一样的就出问题了。


以下就来提出解决方式:

第一种方案:

在自己的应用中,在manifest.xml中注冊receiver的时候增加export属性,例如以下:

 <receiver android:name="com.baroad.demo.MyBroadCastReceiver" android:exported="false">
             <intent-filter >
                <action android:name="com.demo.action"/>
                
            </intent-filter>
        </receiver>

增加这个属性之后,这个广播不会响应外部广播的


另外一种方案:

自己定义权限,在manifest.xml中增加自己定义权限,然后再响应的BroadCastReceiver中增加这个权限就可以

<permission 
        android:name="com.yzy.permission.STARTBROAD"  
        android:protectionLevel="normal">  

然后将上面的权限注冊到BroadCastReceiver

 <receiver android:name="com.baroad.demo.MyBroadCastReceiver"  android:permission="com.yzy.permission.STARTBROAD">
             <intent-filter >
                <action android:name="com.demo.action"/>
                
            </intent-filter>
        </receiver>

第三种方案:

前面两种方案都是在接收广播的地方设置。第三种是在发送方便的地方设置,设置你的广播对哪个报名有效

Intent intent=new Intent("com.demo.action");
    intent.setPackage("com.two.demo");
    this.sendBroadcast(intent);

第四种方案:

使用LocalBroadcastManager来实现广播

 private LocalBroadcastManager mLocalBroadcastManager; 
  private BroadcastReceiver mReceiver;

  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    IntentFilter filter = new IntentFilter();  
    filter.addAction("com.demo.action");  

    mReceiver = new MyBroadCastReceiver();  
   mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
   mLocalBroadcastManager.registerReceiver(mReceiver, filter);
  }

  public void start(View view)
  {
   mLocalBroadcastManager.sendBroadcast(new Intent("com.demo.action"));
  }

@Override
protected void onDestroy() {
   mLocalBroadcastManager.unregisterReceiver(mReceiver);
   super.onDestroy();
} 

好了,就介绍到这里吧,通过以上四种方案,就能够避免自己的应用程序响应其它应用的广播

原文地址:https://www.cnblogs.com/lxjshuju/p/6743250.html