Activity和service的安全性。
Activity 可以被其他的Activity启动起来。 如果启动该activity的应用不是受信的activity,那么导致的结果是未知的。
一种情况,你的activity跑到了别的应用的task里面,这样别的应用在返回的时候,就会调用出你的activity。当然了这种情况在某种意义上可以提高用户体验。
另一种情况,别人通过满足你在Mainfest里面定义的inflate来调用你的activity。
第一种情况的出现是因为在mainfest里面对application或者activity定义了taskAffinity和allowTaskReparenting
<application
android:taskAffinity=“xxx.xxx”
android:allowTaskReparenting="true"
>
<activity android:name="XXXActivity"/>
</application>
这样应用程序包名为xxx.xxx就可以和你在同一个task里面了,就可掉出你的Activity了。例如应用A和B有相同的taskAffinity,则A启动后,切后台。B启动,在home键的的和时候A就被拉起了。
android:taskAffinity意思是:这个application或者activity定义的Task名为xxx.xxx。如果不定义,则默认为本应用程序的包名。
android:allowTaskReparenting="true"的意思是,该activity或者application可以更改从属task。
因此建议不要设置这两个属性,放置其他应用程序劫持你的task。
第二种情况的出现因为在mainfest里面对activity定义了exported=true
这个属性的意思就是外面的apk你可以调用我了。至于怎么调用,一般会定义一个filter。如此暴露必然会引起问题规避这样的问题是加校验如:Context.checkCallingPermission()或在mainfest文件里面添加校验android:permission=“com.xxxxx.xxxx”
Provider的安全性
Provider提供数据访问的接口,具有数据的增,删,改,查。所以这种组件自身需要校验更加严格。其中需要以下几种校验:
1 url校验,最基础的校验。
2 permission校验,如果没有定义某一权限,则不予以回复或者给出限定性的结果。(动态+静态)
3 contentValues校验,防止访问没有开放上的数据内容。
Broadcast的安全性
对于广播的接收方来说,如果只接收应用内部的广播,则需要指定android:exported=false,从而和外界app隔离。或者使用本地广播LocalBroadcastManager来提高安全性。
对于广播的发送方来说,为了避免发送信息被劫持或者数据被窃取,需要将接收方写死到类级别。Intent.setClass(My.this, Receive.class)。