当前位置:操作系统 > 安卓/Android >>

Android 开发中的若干安全问题 之 Activity篇

1.    本app内部使用的activity一定要设置为非公开
                  不准备对外公开的activity一定要设置为非公开,以防止被人非法调用
 
 
[html]  
<activity  
android:name=".PrivateActivity"  
android:label="@string/app_name"  
android:exported="false" />  
 
<activity
android:name=".PrivateActivity"
android:label="@string/app_name"
android:exported="false" />
 
 
 
                 同时,一定要注意的是, 非公开的Activity不能设置intent-filter
 
                 因为,如果假设在同一机器上,有另外一个app有同样的intent-filter的话, 调用该Activity的intent会唤醒android的选择画面, 让你选择使用那个app接受该intent。这样就会事实上绕过了非公开的设置。
 
2.    不要指定taskAffinity
Android中的activity全都归属于task管理 , 简单说来task是一种stack的数据结构, 先入后出。
 
一般来说, 如果不指明归属于什么task, 同一个app内部的所有Activity都会存续在一个task中,task的名字就是app的packageName。
 
因为在同一个andorid设备中,不会有两个同packageName的app存在,所以能保证Activity不被攻击。
 
但是如果你指明taskAffinity,比如如下
 
[html]  
<application android:icon="@drawable/icon" android:label="@string/app_name">   
        <activity android:name=".Activity1"   
                  android:taskAffinity="com.winuxxan.task"   
                  android:label="@string/app_name">   
        </activity>   
        <activity android:name=".Activity2">   
            <intent-filter>   
                <action android:name="android.intent.action.MAIN" />   
                <category android:name="android.intent.category.LAUNCHER" />   
            </intent-filter>   
        </activity>   
    </application>  
 
<application android:icon="@drawable/icon" android:label="@string/app_name"> 
        <activity android:name=".Activity1" 
                  android:taskAffinity="com.winuxxan.task" 
                  android:label="@string/app_name"> 
        </activity> 
        <activity android:name=".Activity2"> 
            <intent-filter> 
                <action android:name="android.intent.action.MAIN" /> 
                <category android:name="android.intent.category.LAUNCHER" /> 
            </intent-filter> 
        </activity> 
    </application>
 
 
那此时,恶意软件中的Activity如果也声明为同样的taskAffinity,那他的Activity就会启动到你的task中,就会有机会拿到你的intent
 
3.    不要指定LaunchMode(默认standard模式)
             Android中Activity的LaunchMode分成 以下四种
 
           Standard:   这种方式打开的Activity不会被当作rootActivity,会生成一个新的Activity的instance,会和打开者在同一个task内
 
             singleTop:      和standard基本一样,唯一的区别在于如果当前task第一个Activity就是该Activity的话,就不会生成新的instance
 
           singleTask:系统会创建一个新task(如果没有启动应用)和一个activity新实例在新task根部,然后,如果activity实例已经存在单独的task中,系统会调用已经存在activity的 onNewIntent()方法,而不是存在新实例,仅有一个activity实例同时存在。
 
            singleInstance: 和singleTask相似,除了系统不会让其他的activities运行在所有持有的task实例中,这个activity是独立的,并且task中的成员只有它,任何其他activities运行这个activity都将打开一个独立的task。
 
               所有发送给root Activity(根Activiy)的intent都会在android中留下履历。所以一般来说严禁用singleTask或者singleInstance来启动画面。
 
               然而,即使用了standard来打开画面,也可能会出问题,比如如果调用者的Activity是用singleInstance模式打开,即使用standard模式打开被调用Activity,因为调用者的Activitytask是不能有其他task的, 所以android会易做图生成一个新的task,并且把被调用者塞进去,最后被调用者就成了rootActivity。
 
程序如下:
 
AndroidManifest.xml 
 
[html]  
<?xml version="1.0" encoding="utf-8"?>  
<manifest xmlns:android="http://schemas.android.com/apk/res/android"  
   package="org.jssec.android.activity.privateactivity"  
   android:versionCode="1"  
android:versionName="1.0" >  
<uses-sdk android:minSdkVersion="8" />  
   <application  
     android:icon="@drawable/ic_launcher"  
     android:label="@string/app_name" >  
     <!—root Activity以”singleInstance”模式启动 -->  
     <!—不设置taskAffinity-->  
   <activity  
     android:name=".PrivateUserActivity"  
      android:label="@string/app_name"  
      android:launchMode="singleInstance" >  
    <intent-filter>  
     <action android:name="android.intent.action.MAIN" />  
     <category android:name="android.intent.category.LAUNCHER" />  
    </intent-filter>  
</activity>  
<!-- 非公開Activity -->  
<!—启动模式为”standard” -->  
<!—不设置taskAffinity-->  
   <activity  
      android:name=".
补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,