【发布时间】:2013-09-26 00:46:42
【问题描述】:
Android documentation 没有说明任何关于 MODE_MULTI_PROCESS 是否安全(安全方面)的信息。
那么,它安全吗?有理由不使用它吗?
【问题讨论】:
标签: android process sharedpreferences
Android documentation 没有说明任何关于 MODE_MULTI_PROCESS 是否安全(安全方面)的信息。
那么,它安全吗?有理由不使用它吗?
【问题讨论】:
标签: android process sharedpreferences
此标志与安全无关,但与访问并发性有关。它效率较低,但尽量避免由多个进程(来自同一个应用程序)访问底层文件引起的问题。如果您不编写多进程应用程序,则不需要它。如果这样做,文档建议使用其他进程间通信。文档出于性能原因而不是安全原因建议不要这样做。
所以一方面MODE_PRIVATE/MODE_WORLD_READABLE/MODE_WORLD_WRITEABLE,另一方面MODE_MULTI_PROCESS是正交标志。如果您使用以下命令打开SharedPreferences:
MODE_PRIVATE --> 安全MODE_WORLD_READABLE --> 不安全MODE_PRIVATE | MODE_MULTI_PROCESS --> 安全MODE_WORLD_READABLE | MODE_MULTI_PROCESS --> 不安全因为MODE_PRIVATE 的值为0:MODE_MULTI_PROCESS 等价于MODE_PRIVATE | MODE_MULTI_PROCESS(即安全)
实际上MODE_MULTI_PROCESS 的源代码中唯一使用的是ContextImpl 类:
@Override
public SharedPreferences getSharedPreferences(String name, int mode) {
SharedPreferencesImpl sp;
synchronized (sSharedPrefs) {
sp = sSharedPrefs.get(name);
if (sp == null) {
File prefsFile = getSharedPrefsFile(name);
sp = new SharedPreferencesImpl(prefsFile, mode);
sSharedPrefs.put(name, sp);
return sp;
}
}
if ((mode & Context.MODE_MULTI_PROCESS) != 0 ||
getApplicationInfo().targetSdkVersion < android.os.Build.VERSION_CODES.HONEYCOMB) {
// If somebody else (some other process) changed the prefs
// file behind our back, we reload it. This has been the
// historical (if undocumented) behavior.
sp.startReloadIfChangedUnexpectedly();
}
return sp;
}
【讨论】:
我想这不安全。
该文档还指出:“这是 Gingerbread (Android 2.3) 中和之前的遗留(但未记录)行为,并且在针对此类版本时隐含此标志。对于面向高于 Android 2.3 的 SDK 版本的应用程序,此标志必须是如果需要,明确设置。”这似乎是他们不鼓励使用的旧功能。
【讨论】:
有一种机制可以防止来自外部进程的访问:SharedPreferences 是应用程序私有的。 Android 安全模型会阻止其他应用访问该文件,即使他们可以找出文件的名称(相信我并不容易)。
【讨论】: