Android 元件安全
1、Activity、Service、BroadcastReceiver、ContentProvider是Android的四大元件,他們的安全性是非常重要的。四大元件的安全漏洞主要集中在是否可以被外部呼叫,外部呼叫是否存在風險。
四大元件是否可以被外部呼叫,決定因素是在AndroidManifest.xml裡面定義的四大元件的標籤export的布林值。如下:
<activity android:name=".PartActivity" android:theme="@android:style/Theme.Dialog" android:export="true"> </activity>
export為true,表示PartActivity可以被外部呼叫。export如果為false,表示PartActivity不可以被外部呼叫。
我們注意到我們在定義四大元件時,經常是不寫export這個標籤的,那麼系統預設的export是什麼呢?
(1)、如果四大元件包含intent-filter,那麼Android系統認為這個元件可以被外部通過隱式呼叫,所以預設export為true。
<activity android:name=".MainActivity" android:label="MainActivity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
(2)、如果四大元件不包含intent-filter,那麼Android系統認為這個元件值只可以被內部通過顯式呼叫,所以預設export為false。
<activity
android:name=".PartActivity"
android:theme="@android:style/Theme.Dialog" >
</activity>
2、為了增加四大元件的安全,可以定義訪問某個元件需要某個許可權。
如果需要使用必須在AndroidManifest.xml,通過申請許可權可以,另外也要注意protectionLevel,如果是Signature,那麼只有和這個應用使用相同私鑰簽名的應用才可以申請這個許可權。<activity android:name=".PartActivity" android:theme="@android:style/Theme.Dialog" > android:permission="com.example.test.permission" </activity> <permission android:name="com.example.test.permission" android:protectionLevel="dangerous" android:label="test" android:description="test_permission" />
<uses-permission android:name="com.example.test.permission" />
3、Intent啟動不同元件的方法如下:
元件名稱 | 方法名稱 |
Activity | startActivity() startActivityForResult() |
Service | startService() bindService() |
Broadcasts | sendBroadcast() sendOrderedBroadcast() sendStickyBroadcast() |
sendBroadcast,有一個方法,可以不用在AndroidManifest.xml裡面宣告,uses-permission;直接傳送時附帶許可權,sendBroadcast(intent, receiverPermission)。動態註冊的receiver可以在程式碼中指定需要訪問它所需要的許可權。
4、ContentProvider安全
<provider
android:name=".StudentContentProvider"
android:authorities="com.example.loadermanagerdemo.StudentContentProvider"
android:readPermission="com.example.testapps.readPermission"
android:writePermission="com.example.testapps.writePermission"
>
</provider>
需要讀contentProvider時,要申請readPermission,需要寫contentProvider時,需申請writePermission。