日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Android開發(fā)中的若干安全問題之Activity篇

1. 本app內(nèi)部使用的activity一定要設(shè)置為非公開

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比嘉定網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式嘉定網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋嘉定地區(qū)。費(fèi)用合理售后完善,十多年實(shí)體公司更值得信賴。

不準(zhǔn)備對(duì)外公開的activity一定要設(shè)置為非公開,以防止被人非法調(diào)用

 
 
  1. android:name=".PrivateActivity" 
  2. android:label="@string/app_name" 
  3. android:exported="false" /> 
  4.  
  5. android:name=".PrivateActivity" 
  6. android:label="@string/app_name" 
  7. android:exported="false" /> 

 

同時(shí),一定要注意的是, 非公開的Activity不能設(shè)置intent-filter

因?yàn)?,如果假設(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管理 , 簡(jiǎn)單說來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,比如如下

 
 
  1. [html] 
  2.  
  3. android:taskAffinity="com.winuxxan.task" 
  4. android:label="@string/app_name"> 
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15. android:taskAffinity="com.winuxxan.task" 
  16. android:label="@string/app_name"> 
  17.  
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  

 

那此時(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。

所有發(fā)送給root Activity(根Activiy)的intent都會(huì)在android中留下履歷。所以一般來說嚴(yán)禁用singleTask或者singleInstance來啟動(dòng)畫面。

然而,即使用了standard來打開畫面,也可能會(huì)出問題,比如如果調(diào)用者的Activity是用singleInstance模式打開,即使用standard模式打開被調(diào)用Activity,因?yàn)檎{(diào)用者的Activitytask是不能有其他task的, 所以android會(huì)被迫生成一個(gè)新的task,并且把被調(diào)用者塞進(jìn)去,最后被調(diào)用者就成了rootActivity。

程序如下:

 
 
  1. AndroidManifest.xml 
  2.  
  3. [html] 
  4.  
  5. package="org.jssec.android.activity.privateactivity" 
  6. android:versionCode="1" 
  7. android:versionName="1.0" > 
  8.  
  9. android:icon="@drawable/ic_launcher" 
  10. android:label="@string/app_name" > 
  11.  
  12.  
  13. android:name=".PrivateUserActivity" 
  14. android:label="@string/app_name" 
  15. android:launchMode="singleInstance" > 
  16.  
  17.  
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24. android:name=".PrivateActivity" 
  25. android:label="@string/app_name" 
  26. android:exported="false" /> 
  27.  
  28.  
  29.  
  30.  
  31. package="org.jssec.android.activity.privateactivity" 
  32. android:versionCode="1" 
  33. android:versionName="1.0" > 
  34.  
  35. android:icon="@drawable/ic_launcher" 
  36. android:label="@string/app_name" > 
  37.  
  38.  
  39. android:name=".PrivateUserActivity" 
  40. android:label="@string/app_name" 
  41. android:launchMode="singleInstance" > 
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50. android:name=".PrivateActivity" 
  51. android:label="@string/app_name" 
  52. android:exported="false" /> 
  53.  
  54.  

 

非公開Activity的代碼如下:

 
 
  1. [java] 
  2. package org.jssec.android.activity.privateactivity; 
  3. import android.app.Activity; 
  4. import android.content.Intent; 
  5. import android.os.Bundle; 
  6. import android.view.View; 
  7. import android.widget.Toast; 
  8. public class PrivateActivity extends Activity { 
  9. @Override 
  10. public void onCreate(Bundle savedInstanceState) { 
  11. super.onCreate(savedInstanceState); 
  12. setContentView(R.layout.private_activity); 
  13. String param = getIntent().getStringExtra("PARAM"); 
  14. Toast.makeText(this, String.format("「%s」取得。", param), 
  15. Toast.LENGTH_LONG).show(); 
  16.  
  17. public void onReturnResultClick(View view) { 
  18. Intent intent = new Intent(); 
  19. intent.putExtra("RESULT", 機(jī)密數(shù)據(jù)"); 
  20. setResult(RESULT_OK, intent); 
  21. finish(); 
  22.  
  23. package org.jssec.android.activity.privateactivity; 
  24. import android.app.Activity; 
  25. import android.content.Intent; 
  26. import android.os.Bundle; 
  27. import android.view.View; 
  28. import android.widget.Toast; 
  29. public class PrivateActivity extends Activity { 
  30. @Override 
  31. public void onCreate(Bundle savedInstanceState) { 
  32. super.onCreate(savedInstanceState); 
  33. setContentView(R.layout.private_activity); 
  34. String param = getIntent().getStringExtra("PARAM"); 
  35. Toast.makeText(this, String.format("「%s」取得。", param), 
  36. Toast.LENGTH_LONG).show(); 
  37.  
  38. public void onReturnResultClick(View view) { 
  39. Intent intent = new Intent(); 
  40. intent.putExtra("RESULT", 機(jī)密數(shù)據(jù)"); 
  41. setResult(RESULT_OK, intent); 
  42. finish(); 

 

調(diào)用非公開Activity者,以standard模式打開

 
 
  1. [java] 
  2. package org.jssec.android.activity.privateactivity; 
  3. import android.app.Activity; 
  4. import android.content.Intent; 
  5. import android.os.Bundle; 
  6. import android.view.View; 
  7. import android.widget.Toast; 
  8. public class PrivateUserActivity extends Activity { 
  9. private static final int REQUEST_CODE = 1; 
  10.  
  11. @Override 
  12. public void onCreate(Bundle savedInstanceState) { 
  13. super.onCreate(savedInstanceState); 
  14. setContentView(R.layout.user_activity); 
  15.  
  16. public void onUseActivityClick(View view) { 
  17. // 用standard模式啟動(dòng)非公開Activity 
  18. Intent intent = new Intent(); 
  19. intent.setClass(this, PrivateActivity.class); 
  20. intent.putExtra("PARAM", "機(jī)密數(shù)據(jù)"); 
  21. startActivityForResult(intent, REQUEST_CODE); 
  22.  
  23. @Override 
  24. public void onActivityResult(int requestCode, int resultCode, 
  25. Intent data) { 
  26. super.onActivityResult(requestCode, resultCode, data); 
  27. if (resultCode != RESULT_OK) 
  28. return; 
  29. switch (requestCode) { 
  30. case REQUEST_CODE: 
  31. String result = data.getStringExtra("RESULT"); 
  32. break; 
  33.  
  34. package org.jssec.android.activity.privateactivity; 
  35. import android.app.Activity; 
  36. import android.content.Intent; 
  37. import android.os.Bundle; 
  38. import android.view.View; 
  39. import android.widget.Toast; 
  40. public class PrivateUserActivity extends Activity { 
  41. private static final int REQUEST_CODE = 1; 
  42.  
  43. @Override 
  44. public void onCreate(Bundle savedInstanceState) { 
  45. super.onCreate(savedInstanceState); 
  46. setContentView(R.layout.user_activity); 
  47.  
  48. public void onUseActivityClick(View view) { 
  49. // 用standard模式啟動(dòng)非公開Activity 
  50. Intent intent = new Intent(); 
  51. intent.setClass(this, PrivateActivity.class); 
  52. intent.putExtra("PARAM", "機(jī)密數(shù)據(jù)"); 
  53. startActivityForResult(intent, REQUEST_CODE); 
  54.  
  55. @Override 
  56. public void onActivityResult(int requestCode, int resultCode, 
  57. Intent data) { 
  58. super.onActivityResult(requestCode, resultCode, data); 
  59. if (resultCode != RESULT_OK) 
  60. return; 
  61. switch (requestCode) { 
  62. case REQUEST_CODE: 
  63. String result = data.getStringExtra("RESULT"); 
  64. break; 

 

 

4. 發(fā)給Activity的intent不要設(shè)定為FLAG_ACTIVITY_NEW_TASK

就算上面的Activity的lauchMode設(shè)置完善了, 在打開intent的時(shí)候還是能指定打開模式。

比如在intent中指明用FLAG_ACTIVITY_NEW_TASK模式的話,發(fā)現(xiàn)該activity不存在的話,就會(huì)強(qiáng)制新建一個(gè)task。如果同時(shí)設(shè)置了FLAG_ACTIVITY_MULTIPLE_TASK+ FLAG_ACTIVITY_NEW_TASK,就無論如何都會(huì)生成新的task,該Activity就會(huì)變成rootActiviy,并且intent會(huì)被留成履歷

 

5. Intent中數(shù)據(jù)的加密

Activity中數(shù)據(jù)的傳遞都依靠intent, 很容易被攻擊, 所以 就算同一個(gè)app內(nèi)部傳遞數(shù)據(jù), 最好還是要加密, 加密算法很多

6. 明確ActivityName發(fā)送Intent

明確Activity發(fā)送Intent,能夠避免被惡意軟件截取。

同一app內(nèi)部的發(fā)送

 
 
  1. [java] 
  2. Intent intent = new Intent(this, PictureActivity.class); 
  3. intent.putExtra("BARCODE", barcode); 
  4. startActivity(intent); 
  5.  
  6. Intent intent = new Intent(this, PictureActivity.class); 
  7. intent.putExtra("BARCODE", barcode); 
  8. startActivity(intent); 
  9.  
  10.  
  11. 不同app內(nèi)部的發(fā)送 
  12.  
  13. [java] 
  14. Intent intent = new Intent(); 
  15. intent.setClassName( 
  16. "org.jssec.android.activity.publicactivity", 
  17. "org.jssec.android.activity.publicactivity.PublicActivity"); 
  18. startActivity(intent); 
  19.  
  20. Intent intent = new Intent(); 
  21. intent.setClassName( 
  22. "org.jssec.android.activity.publicactivity", 
  23. "org.jssec.android.activity.publicactivity.PublicActivity"); 
  24. startActivity(intent); 

 

但是,要注意的是!

不是指明了packageName和ActivityName就能避免所有的問題,

如果有一個(gè)惡意軟件故意做成和你發(fā)送目標(biāo)同packageName, 同ActivityName, 此時(shí)的intent就會(huì)被截取

7. 跨app接受Intent時(shí),要明確對(duì)方的身份

接受到別的app發(fā)來的intent時(shí),要能確定對(duì)方的身份。

一個(gè)好方法是比對(duì)對(duì)方的app的hashcode。

當(dāng)前,前提是調(diào)用者要用startActivityForResult(),因?yàn)橹挥羞@個(gè)方法,被調(diào)用者才能得到調(diào)用者的packageName

代碼如下:

被調(diào)用的Activity

 
 
  1. [java] 
  2. package org.jssec.android.activity.exclusiveactivity; 
  3. import org.jssec.android.shared.PkgCertWhitelists; 
  4. import org.jssec.android.shared.Utils; 
  5. import android.app.Activity; 
  6. import android.content.Context; 
  7. import android.content.Intent; 
  8. import android.os.Bundle; 
  9. import android.view.View; 
  10. import android.widget.Toast; 
  11. public class ExclusiveActivity extends Activity { 
  12. // hashcode的白名單 
  13. private static PkgCertWhitelists sWhitelists = null; 
  14.  
  15. private static void buildWhitelists(Context context) { 
  16. boolean isdebug = Utils.isDebuggable(context); 
  17. sWhitelists = new PkgCertWhitelists(); 
  18. sWhitelists 
  19. .add("org.jssec.android.activity.exclusiveuser", isdebug ? 
  20. "0EFB7236 328348A9 89718BAD DF57F544 D5CCB4AE B9DB34BC 1E29DD26 F77C8255" 
  21. "1F039BB5 7861C27A 3916C778 8E78CE00 690B3974 3EB8259F E2627B8D 4C0EC35A"); 
  22.  
  23. private static boolean checkPartner(Context context, String pkgname) { 
  24. if (sWhitelists == null) 
  25. buildWhitelists(context); 
  26. return sWhitelists.test(context, pkgname); 
  27.  
  28. @Override 
  29. public void onCreate(Bundle savedInstanceState) { 
  30. super.onCreate(savedInstanceState); 
  31. setContentView(R.layout.main); 
  32. // check白名單 
  33. if (!checkPartner(this, getCallingPackage())) { 
  34. Toast.makeText(this, "不是白名單內(nèi)部的。", Toast.LENGTH_LONG).show(); 
  35. finish(); 
  36. return; 
  37.  
  38. public void onReturnResultClick(View view) { 
  39. Intent intent = new Intent(); 
  40. intent.putExtra("RESULT", "機(jī)密數(shù)據(jù)"); 
  41. setResult(RESULT_OK, intent); 
  42. finish(); 
  43.  
  44. package org.jssec.android.activity.exclusiveactivity; 
  45. import org.jssec.android.shared.PkgCertWhitelists; 
  46. import org.jssec.android.shared.Utils; 
  47. import android.app.Activity; 
  48. import android.content.Context; 
  49. import android.content.Intent; 
  50. import android.os.Bundle; 
  51. import android.view.View; 
  52. import android.widget.Toast; 
  53. public class ExclusiveActivity extends Activity { 
  54. // hashcode的白名單 
  55. private static PkgCertWhitelists sWhitelists = null; 
  56.  
  57. private static void buildWhitelists(Context context) { 
  58. boolean isdebug = Utils.isDebuggable(context); 
  59. sWhitelists = new PkgCertWhitelists(); 
  60. sWhitelists 
  61. .add("org.jssec.android.activity.exclusiveuser", isdebug ? 
  62. "0EFB7236 328348A9 89718BAD DF57F544 D5CCB4AE B9DB34BC 1E29DD26 F77C8255" 
  63. "1F039BB5 7861C27A 3916C778 8E78CE00 690B3974 3EB8259F E2627B8D 4C0EC35A"); 
  64.  
  65. private static boolean checkPartner(Context context, String pkgname) { 
  66. if (sWhitelists == null) 
  67. buildWhitelists(context); 
  68. return sWhitelists.test(context, pkgname); 
  69.  
  70. @Override 
  71. public void onCreate(Bundle savedInstanceState) { 
  72. super.onCreate(savedInstanceState); 
  73. setContentView(R.layout.main); 
  74. // check白名單 
  75. if (!checkPartner(this, getCallingPackage())) { 
  76. Toast.makeText(this, "不是白名單內(nèi)部的。", Toast.LENGTH_LONG).show(); 
  77. finish(); 
  78. return; 
  79.  
  80. public void onReturnResultClick(View view) { 
  81. Intent intent = new Intent(); 
  82. intent.putExtra("RESULT", "機(jī)密數(shù)據(jù)"); 
  83. setResult(RESULT_OK, intent); 
  84. finish(); 
  85. } [java] 
  86.  
  87.  
  88. PkgCertWhitelists.java 
  89. [java] 
  90. package org.jssec.android.shared; 
  91. import java.util.HashMap; 
  92. import java.util.Map; 
  93. import android.content.Context; 
  94. public class PkgCertWhitelists { 
  95. private Map mWhitelists = new HashMap(); 
  96.  
  97. public boolean add(String pkgname, String sha256) { 
  98. if (pkgname == null) 
  99. return false; 
  100. if (sha256 == null) 
  101. return false; 
  102. sha256 = sha256.replaceAll(" ", ""); 
  103. if (sha256.length() != 64) 
  104. return false; 
  105. sha256 = sha256.toUpperCase(); 
  106. if (sha256.replaceAll("[0-9A-F]+", "").length() != 0) 
  107. return false; 
  108. mWhitelists.put(pkgname, sha256); 
  109. return true; 
  110.  
  111. public boolean test(Context ctx, String pkgname) { 
  112. String correctHash = mWhitelists.get(pkgname); 
  113. return PkgCert.test(ctx, pkgname, correctHash); 
  114.  
  115. package org.jssec.android.shared; 
  116. import java.util.HashMap; 
  117. import java.util.Map; 
  118. import android.content.Context; 
  119. public class PkgCertWhitelists { 
  120. private Map mWhitelists = new HashMap(); 
  121.  
  122. public boolean add(String pkgname, String sha256) { 
  123. if (pkgname == null) 
  124. return false; 
  125. if (sha256 == null) 
  126. return false; 
  127. sha256 = sha256.replaceAll(" ", ""); 
  128. if (sha256.length() != 64) 
  129. return false; 
  130. sha256 = sha256.toUpperCase(); 
  131. if (sha256.replaceAll("[0-9A-F]+", "").length() != 0) 
  132. return false; 
  133. mWhitelists.put(pkgname, sha256); 
  134. return true; 
  135.  
  136. public boolean test(Context ctx, String pkgname) { 
  137. String correctHash = mWhitelists.get(pkgname); 
  138. return PkgCert.test(ctx, pkgname, correctHash); 
  139. PkgCert.java 
  140. [java] 
  141.  
  142. package org.jssec.android.shared; 
  143. import java.security.MessageDigest; 
  144. import java.security.NoSuchAlgorithmException; 
  145. import android.content.Context; 
  146. import android.content.pm.PackageInfo; 
  147. import android.content.pm.PackageManager; 
  148. import android.content.pm.PackageManager.NameNotFoundException; 
  149. import android.content.pm.Signature; 
  150. public class PkgCert { 
  151. public static boolean test(Context ctx, String pkgname, 
  152. String correctHash) { 
  153. if (correctHash == null) 
  154. return false; 
  155. correctHash = correctHash.replaceAll(" ", ""); 
  156. return correctHash.equals(hash(ctx, pkgname)); 
  157.  
  158. public static String hash(Context ctx, String pkgname) { 
  159. if (pkgname == null) 
  160. return null; 
  161. try { 
  162. PackageManager pm = ctx.getPackageManager(); 
  163. PackageInfo pkginfo = pm.getPackageInfo(pkgname, 
  164. PackageManager.GET_SIGNATURES); 
  165. if (pkginfo.signatures.length != 1) 
  166. return null; 
  167. Signature sig = pkginfo.signatures[0]; 
  168. byte[] cert = sig.toByteArray(); 
  169. byte[] sha256 = computeSha256(cert); 
  170. return byte2hex(sha256); 
  171. } catch (NameNotFoundException e) { 
  172. return null; 
  173.  
  174. private static byte[] computeSha256(byte[] data) { 
  175. try { 
  176. return MessageDigest.getInstance("SHA-256").digest(data); 
  177. } catch (NoSuchAlgorithmException e) { 
  178. return null; 
  179.  
  180. private static String byte2hex(byte[] data) { 
  181. if (data == null) 
  182. return null; 
  183. final StringBuilder hexadecimal = new StringBuilder(); 
  184. for (final byte b : data) { 
  185. hexadecimal.append(String.format("%02X", b)); 
  186. return hexadecimal.toString(); 
  187.  
  188.  
  189. package org.jssec.android.shared; 
  190. import java.security.MessageDigest; 
  191. import java.security.NoSuchAlgorithmException; 
  192. import android.content.Context; 
  193. import android.content.pm.PackageInfo; 
  194. import android.content.pm.PackageManager; 
  195. import android.content.pm.PackageManager.NameNotFoundException; 
  196. import android.content.pm.Signature; 
  197. public class PkgCert { 
  198. public static boolean test(Context ctx, String pkgname, 
  199. String correctHash) { 
  200. if (correctHash == null) 
  201. return false; 
  202. correctHash = correctHash.replaceAll(" ", ""); 
  203. return correctHash.equals(hash(ctx, pkgname)); 
  204.  
  205. public static String hash(Context ctx, String pkgname) { 
  206. if (pkgname == null) 
  207. return null; 
  208. try { 
  209. PackageManager pm = ctx.getPackageManager(); 
  210. PackageInfo pkginfo = pm.getPackageInfo(pkgname, 
  211. PackageManager.GET_SIGNATURES); 
  212. if (pkginfo.signatures.length != 1) 
  213. return null; 
  214. Signature sig = pkginfo.signatures[0]; 
  215. byte[] cert = sig.toByteArray(); 
  216. byte[] sha256 = computeSha256(cert); 
  217. return byte2hex(sha256); 
  218. } catch (NameNotFoundException e) { 
  219. return null; 
  220.  
  221. private static byte[] computeSha256(byte[] data) { 
  222. try { 
  223. return MessageDigest.getInstance("SHA-256").digest(data); 
  224. } catch (NoSuchAlgorithmException e) { 
  225. return null; 
  226.  
  227. private static String byte2hex(byte[] data) { 
  228. if (data == null) 
  229. return null; 
  230. final StringBuilder hexadecimal = new StringBuilder(); 
  231. for (final byte b : data) { 
  232. hexadecimal.append(String.format("%02X", b)); 
  233. return hexadecimal.toString(); 

 

8. 所有根Activity中的intent都能被所有app共享

所有的app,只要按照如下樣子,就能取出這臺(tái)手機(jī)上所有task上所有根Activity接受到的intent

 
 
  1. AndroidManifest.xml 
  2.  
  3. [html] 
  4. package="org.jssec.android.intent.maliciousactivity" 
  5. android:versionCode="1" 
  6. android:versionName="1.0" > 
  7.  
  8. android:minSdkVersion="8" 
  9. android:targetSdkVersion="15" /> 
  10.  
  11. android:icon="@drawable/ic_launcher" 
  12. android:label="@string/app_name" 
  13. android:theme="@style/AppTheme" > 
  14. android:name=".MaliciousActivity" 
  15. android:label="@string/title_activity_main" > 
  16.  
  17.  
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28. package="org.jssec.android.intent.maliciousactivity" 
  29. android:versionCode="1" 
  30. android:versionName="1.0" > 
  31.  
  32. android:minSdkVersion="8" 
  33. android:targetSdkVersion="15" /> 
  34.  
  35. android:icon="@drawable/ic_launcher" 
  36. android:label="@string/app_name" 
  37. android:theme="@style/AppTheme" > 
  38. android:name=".MaliciousActivity" 
  39. android:label="@string/title_activity_main" > 
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51. MaliciousActivity.java 
  52.  
  53. [java] 
  54. package org.jssec.android.intent.maliciousactivity; 
  55. import java.util.List; 
  56. import android.app.Activity; 
  57. import android.app.ActivityManager; 
  58. import android.content.Intent; 
  59. import android.os.Bundle; 
  60. import android.util.Log; 
  61. public class MaliciousActivity extends Activity { 
  62. @Override 
  63. public void onCreate(Bundle savedInstanceState) { 
  64. super.onCreate(savedInstanceState); 
  65. setContentView(R.layout.malicious_activity); 
  66. ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
  67. List list = activityManager 
  68. .getRecentTasks(100, ActivityManager.RECENT_WITH_EXCLUDED); 
  69. for (ActivityManager.RecentTaskInfo r : list) { 
  70. Intent intent = r.baseIntent; 
  71. Log.v("baseIntent", intent.toString()); 
  72.  
  73. package org.jssec.android.intent.maliciousactivity; 
  74. import java.util.List; 
  75. import android.app.Activity; 
  76. import android.app.ActivityManager; 
  77. import android.content.Intent; 
  78. import android.os.Bundle; 
  79. import android.util.Log; 
  80. public class MaliciousActivity extends Activity { 
  81. @Override 
  82. public void onCreate(Bundle savedInstanceState) { 
  83. super.onCreate(savedInstanceState); 
  84. setContentView(R.layout.malicious_activity); 
  85. ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
  86. List list = activityManager 
  87. .getRecentTasks(100, ActivityManager.RECENT_WITH_EXCLUDED); 
  88. for (ActivityManager.RecentTaskInfo r : list) { 
  89. Intent intent = r.baseIntent; 
  90. Log.v("baseIntent", intent.toString()); 

 

 

9. Intent數(shù)據(jù)遺漏到LogCat的可能性

如果像如下代碼,那Intent中發(fā)送的數(shù)據(jù)就會(huì)被自動(dòng)寫入LogCat

 
 
  1. [java] 
  2. Uri uri = Uri.parse("mailto:test@gmail.com"); 
  3. Intent intent = new Intent(Intent.ACTION_SENDTO, uri); 
  4. startActivity(intent); 
  5.  
  6. Uri uri = Uri.parse("mailto:test@gmail.com"); 
  7. Intent intent = new Intent(Intent.ACTION_SENDTO, uri); 
  8. startActivity(intent); 
  9.  
  10.  
  11. 如果像如下,就能避免 
  12.  
  13. [java] 
  14. Uri uri = Uri.parse("mailto:"); 
  15. Intent intent = new Intent(Intent.ACTION_SENDTO, uri); 
  16. intent.putExtra(Intent.EXTRA_EMAIL, new String[] {"test@gmail.com"}); 
  17. startActivity(intent); 
  18.  
  19. Uri uri = Uri.parse("mailto:"); 
  20. Intent intent = new Intent(Intent.ACTION_SENDTO, uri); 
  21. intent.putExtra(Intent.EXTRA_EMAIL, new String[] {"test@gmail.com"}); 
  22. startActivity(intent); 

分享名稱:Android開發(fā)中的若干安全問題之Activity篇
URL分享:http://www.dlmjj.cn/article/djposid.html