Android 開發(fā)中的若干安全問題 之 Activity篇
發(fā)布時(shí)間:2016-01-08 10:13 | 作者:采集俠 | 來源:網(wǎng)絡(luò)整理 | 瀏覽:119
1. ? ?本app內(nèi)部使用的activity一定要設(shè)置為非公開
不準(zhǔn)備對外公開的activity一定要設(shè)置為非公開,以防止被人非法調(diào)用
[html]
android:name=".PrivateActivity"
android:label="@string/app_name"
android:exported="false" />
android:name=".PrivateActivity"
android:label="@string/app_name"
android:exported="false" />
同時(shí),一定要注意的是, 非公開的Activity不能設(shè)置intent-filter
因?yàn)椋绻僭O(shè)在同一機(jī)器上,有另外一個(gè)app有同樣的intent-filter的話, 調(diào)用該Activity的intent會(huì)喚醒a(bǔ)ndroid的選擇畫面, 讓你選擇使用那個(gè)app接受該intent。這樣就會(huì)事實(shí)上繞過了非公開的設(shè)置。
2. ? ?不要指定taskAffinity
Android中的activity全都?xì)w屬于task管理 , 簡單說來task是一種stack的數(shù)據(jù)結(jié)構(gòu), 先入后出。
一般來說, 如果不指明歸屬于什么task, 同一個(gè)app內(nèi)部的所有Activity都會(huì)存續(xù)在一個(gè)task中,task的名字就是app的packageName。
因?yàn)樵谕粋€(gè)andorid設(shè)備中,不會(huì)有兩個(gè)同packageName的app存在,所以能保證Activity不被攻擊。
但是如果你指明taskAffinity,比如如下
[html]
android:taskAffinity="com.winuxxan.task"
android:label="@string/app_name">
android:taskAffinity="com.winuxxan.task"
android:label="@string/app_name">
那此時(shí),惡意軟件中的Activity如果也聲明為同樣的taskAffinity,那他的Activity就會(huì)啟動(dòng)到你的task中,就會(huì)有機(jī)會(huì)拿到你的intent
3. ? ?不要指定LaunchMode(默認(rèn)standard模式)
Android中Activity的LaunchMode分成 以下四種
Standard: ? 這種方式打開的Activity不會(huì)被當(dāng)作rootActivity,會(huì)生成一個(gè)新的Activity的instance,會(huì)和打開者在同一個(gè)task內(nèi)
singleTop: ? ? ?和standard基本一樣,唯一的區(qū)別在于如果當(dāng)前task第一個(gè)Activity就是該Activity的話,就不會(huì)生成新的instance
singleTask:系統(tǒng)會(huì)創(chuàng)建一個(gè)新task(如果沒有啟動(dòng)應(yīng)用)和一個(gè)activity新實(shí)例在新task根部,然后,如果activity實(shí)例已經(jīng)存在單獨(dú)的task中,系統(tǒng)會(huì)調(diào)用已經(jīng)存在activity的 onNewIntent()方法,而不是存在新實(shí)例,僅有一個(gè)activity實(shí)例同時(shí)存在。
singleInstance: 和singleTask相似,除了系統(tǒng)不會(huì)讓其他的activities運(yùn)行在所有持有的task實(shí)例中,這個(gè)activity是獨(dú)立的,并且task中的成員只有它,任何其他activities運(yùn)行這個(gè)activity都將打開一個(gè)獨(dú)立的task。