检查Activities
通常情况下,在Android应用程序中,Activity是应用程序中的“屏幕”。
细节
如果一个Activity被设置为exported并enabled,任何应用程序都可以调用该Activity。这可能允许攻击者以开发者非预期的方式加载UI元素,例如跳过密码锁定屏幕来访问数据或功能。默认情况下,Activity组件不会暴露。但是,如果为Activity定义了Intent过滤器,则系统将Activity默认设置为暴露。
建议
Activity可以通过检查内部应用程序的状态来判断它们是否可以被加载,以此确保正确的行为。例如,首先看看应用程序是否处于“未锁定”状态,如果不是则跳回到锁定屏幕。只要对Activity定义了Intent过滤器,exported/enabled的Activity都可以直接被调用,并传入非法参数。因此当一个操作是由不受信任的来源提供数据时,建议进行输入验证。
传递Intent extra ID的示例代码,而不要传递整个对象。
//bad passing the whole paracable object
public static Intent getStartingIntent(Context context,
User user) {
Intent i = new Intent(context, UserDetailsActivity.class);
i.putExtra(EXTRA_USER, user);
return i;
}
//better to pass just the ID to lookup the user details
public static Intent getStartingIntent(Context context,
String userId) {
Intent i = new Intent(context, UserDetailsActivity.class);
i.putExtra(EXTRA_USER_ID, userId);
return i;
}
如果Activity是私有的,请避免使用过滤器,而不是使用显式Intent。
<activity
android:name="com.app.YourActivity"
android:label="@string/app_name"
android:excludeFromRecents="true"
android:exported="false" >
</activity>