2013-09-26 51 views

回答

9

此標誌與安全性無關,但要訪問協議。效率較低,但要儘量避免由多個進程(來自同一應用程序)訪問底層文件引起的問題。如果你不寫一個多進程應用程序,你不需要它。如果這樣做,文檔建議使用其他進程間通信。該文檔建議反對它出於性能的原因,而不是安全。

所以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; 
} 
+0

I同意這是文檔說的,但沒有提到安全性的快速並不意味着它不是問題 – dors

+0

添加了一些解釋 – bwt

+0

很好的解釋,謝謝 – dors

0

我想這不安全。

該文檔還指出:「這是Gingerbread(Android 2.3)中和之前的遺留(但未公開)行爲,並且此目標位於此版本的目標位置時,此標誌暗指針對大於Android 2.3的SDK版本的應用程序,此標誌必須如果需要,可以明確設置。「這似乎是一個他們不鼓勵使用的舊功能。

+0

我不確定是這種情況......跨進程訪問共享首選項有時非常方便。事實上它不是默認行爲,並不意味着它不安全 – dors

+0

似乎沒有任何機制可以阻止其他外部進程的訪問......除了不知道名稱...... – Szymon

0

有一個機制,以防止外國進程的訪問:SharedPreferences爲應用程序和私營部門。 Android安全模型可以阻止其他應用程序訪問該文件,即使他們能夠找出其名稱(相信我並不輕鬆)。

+0

所以我應該感到安全使用MODE_MULTI_PROCESS保存敏感數據? Android的文檔中是否有對這種機制的引用? – dors

相關問題