android应用安全——组件通信安全(Intent)
一、Intent基础知识
Intent启动不同组件的方法如下:
组件名称
方法名称
Activity
startActivity()
startActivityForResult()
Service
startService()
bindService()
Broadcasts
sendBroadcast()
sendOrderedBroadcast()
sendStickyBroadcast()
Intent的两种基本用法:一种是显式的Intent,即在构造Intent对象时就指定接收者;
另一种是隐式的Intent,即Intent的发送者在构造Intent对象时,并不知道也不关心接收
者是谁,有利于降低发送者和接收者之间的耦合。
显示调用例子:
[java] view plain copy print ?
- Intentintent=newIntent();
- intent.setClassName("com.samples.intent.simple",
- "com.samples.intent.simple.TestActivity");
- startActivity(intent);
- Intentintent=newIntent(A.activity,B.class);
- startActivity(intent);
隐式调用例子
[java] view plain copy print ?
- Intentintent=newIntent(Intent.ACTION_DIAL);
- startActivity(intent);
- Intentintent=newIntent("com.test.broadcast");
- intent.putString("PASSWORD","123456");
- sendBroadcast(intent);
- Intentintent=newIntent("com.test.service");
- intent.putString("USERNAME","test");
- startService(intent);
显示调用和隐式调用都能过在不同应用间传递数据。
二、可能产生的风险:
1、恶意调用
2、恶意接受数据
3、仿冒应用,例如(恶意钓鱼,启动登录界面)
4、恶意发送广播、启动应用服务。
5、调用组件,接受组件返回的数据
6、拦截有序广播
上面也是想到了一部分,应用中应该会有更多的例子。
三、怎样避归风险:
1、最小化组件暴露
不参与跨应用调用的组件添加android:exported="false"属性,这个属性说明它是私有的,只有同一个应用程序的组件或带有相同用户ID的应用程序才能启动或绑定该服务。
[html] view plain copy print ?
- <activity
- android:name=".LoginActivity"
- android:label="@string/app_name"
- android:screenOrientation="portrait"
- android:exported="false">
2、设置组件访问权限
参与跨应用调用的组件或者公开的广播、服务设置权限。设置权限如下:
(1)组件添加android:permission属性。
- <activityandroid:name=".Another"android:label="@string/app_name"
- android:permission="com.test.custempermission">
- </activity>
(2)声明< permission>属性
[html] view plain copy print ?- <permissionandroid:description="test"
- android:label="test"
- android:name="com.test.custempermission"
- android:protectionLevel="normal">
- </permission>
protectionLevel有四种级别normal、dangerous、signature、signatureOrSystem。signature、signatureOrSystem时,只有相同签名时才能调用。
(3)调用组件者声明<uses-permission>
- <uses-permissionandroid:name="com.test.custempermission"/>
3、暴露组件的代码检查
Android 提供各种 API 来在运行时检查、执行、授予和撤销权限。这些 API
是android.content.Context
类的一部分,这个类提供有关应用程序环境的全局信息。
- if(context.checkCallingOrSelfPermission("com.test.custempermission")
- !=PackageManager.PERMISSION_GRANTED){
- //TheApplicationrequirespermissiontoaccessthe
- //Internet");
- }else{
- //OKtoaccesstheInternet
- }
参考:android安全-intent
Android 安全架构及权限控制机制剖析
http://www.ibm.com/developerworks/cn/opensource/os-cn-android-sec/
更多相关文章
- 浅析Android录屏 MediaRecorder
- 关于Android(安卓)6.0上应用的动态权限授权解决方案!
- Intent和Intent Filter的区别
- 构建自定义组件
- Android基础之Intent和Intent Filter
- Android(安卓)USB Host与HID设备通信
- Android(安卓)有些机型不带tcpdump的解决办法
- android 通过adb命令控制wifi开关
- android系统属性读写操作SystemProperties