zoukankan      html  css  js  c++  java
  • 关于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();
    } 

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

  • 相关阅读:
    BZOJ3732: Network
    BZOJ2705: [SDOI2012]Longge的问题
    BZOJ3712: [PA2014]Fiolki
    BZOJ3709: [PA2014]Bohater
    BZOJ3668: [Noi2014]起床困难综合症
    CoderForces985F-Isomorphic Strings
    CodeForces985C-Liebig's Barrels
    Open-Pit Mining
    Multiplication Game
    象棋
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/6743250.html
Copyright © 2011-2022 走看看