【发布时间】:2013-09-25 02:26:43
【问题描述】:
为什么openFileOutput() 模式为MODE_WORLD_READABLE 的文件(如手册says)足以使其他应用程序可以读取文件(通过共享意图)?
即使文件是可读的,目录不是保持私有(rwx------而不是rwxrwxrwx)吗?
【问题讨论】:
标签: java android android-intent android-file android-sharing
为什么openFileOutput() 模式为MODE_WORLD_READABLE 的文件(如手册says)足以使其他应用程序可以读取文件(通过共享意图)?
即使文件是可读的,目录不是保持私有(rwx------而不是rwxrwxrwx)吗?
【问题讨论】:
标签: java android android-intent android-file android-sharing
即使文件可读,目录是否保持私有(rwx------而不是rwxrwxrwx)?
将目录设为deny-all 会阻止第三方列出目录的内容或在其中创建新文件。在给定文件的完全限定路径的情况下,它不会影响读取该文件的能力。
话虽如此,请不要使用MODE_WORLD_READABLE。 Use FileProvider instead,因此您可以更精细地控制谁可以访问该内容。这样,例如,对于特定的共享操作,您可以让文件完全无法访问除了。
【讨论】:
FileProvider 而不是MODE_WORLD_READABLE,但额外安全性的价值会随着文件对不法分子可用的每一毫秒而攀升。
我认为手动引用不正确。无论其模式如何,其他应用程序都无法读取内部存储中的文件。您遇到的困惑并不少见,这就是为什么应用程序应该使用 FileProvider 向其他应用程序提供文件的原因。
这是一个安全问题:文件系统权限不能充分保护数据。要通过文件权限将文件提供给另一个应用程序,您必须设置相当于 chmod a+r (至少)。这提供了对任何其他应用程序的读取权限,这是对任何 Tom、Dick 或 Harry 开始啜饮您文件的邀请。此外,访问更改是永久性的,除非您记得将其更改回来。
相比之下,使用带有 FileProvider 的 URI 权限仅提供临时读取访问权限,并且仅对请求它的特定应用程序提供。您可以设置您的应用程序,以便仅在用户访问您的应用程序请求文件时授予访问权限;至少,用户知道请求文件的应用程序和拥有文件的应用程序。
【讨论】: