Режим MODE_MULTI_PROCESS SharedPreferences менее безопасен, чем MODE_PRIVATE

В документации для Android не указано ничего, относительно MODE_MULTI_PROCESS безопасно (безопасно) или нет.

Так, это безопасно? Есть ли причина не использовать его?

Этот флаг не связан с безопасностью, а для доступа к соглашению. Он менее эффективен, но пытается избежать проблем, вызванных несколькими процессами (из одного приложения), которые обращаются к базовому файлу. Если вы не пишете многопроцессорное приложение, вам это не нужно. Если вы это сделаете, в документации предлагается использовать другую межпроцессную связь. Документация советует против него по соображениям производительности, а не по безопасности.

Таким образом, MODE_PRIVATE / MODE_WORLD_READABLE / MODE_WORLD_WRITEABLE с одной стороны и MODE_MULTI_PROCESS – это ортогональные флаги. Если вы откроете SharedPreferences с помощью:

  • MODE_PRIVATE -> безопасный
  • MODE_WORLD_READABLE -> небезопасный
  • MODE_PRIVATE | MODE_MULTI_PROCESS MODE_PRIVATE | MODE_MULTI_PROCESS -> безопасный
  • MODE_WORLD_READABLE | MODE_MULTI_PROCESS MODE_WORLD_READABLE | MODE_MULTI_PROCESS -> небезопасный

И поскольку MODE_PRIVATE имеет значение 0: MODE_MULTI_PROCESS эквивалентно MODE_PRIVATE | 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), и этот флаг подразумевается при планировании таких выпусков. Для приложений, предназначенных для версий SDK, больших, чем Android 2.3, этот флаг должен быть явно установлен, если желательно «. Кажется, это старая функция, которую они не поощряют использовать.

Существует механизм предотвращения доступа из внешних процессов: SharedPreferences – это приложение-личное. Модель безопасности Android препятствует тому, чтобы другие приложения попадали в файл, даже если кто-то может определить его имя (которые считают, что это нелегко).