【问题标题】:Access permissions during android file sharingandroid文件共享期间的访问权限
【发布时间】:2013-09-25 02:26:43
【问题描述】:

为什么openFileOutput() 模式为MODE_WORLD_READABLE 的文件(如手册says)足以使其他应用程序可以读取文件(通过共享意图)?

即使文件是可读的,目录不是保持私有(rwx------而不是rwxrwxrwx)吗?

【问题讨论】:

标签: java android android-intent android-file android-sharing


【解决方案1】:

即使文件可读,目录是否保持私有(rwx------而不是rwxrwxrwx)?

将目录设为deny-all 会阻止第三方列出目录的内容或在其中创建新文件。在给定文件的完全限定路径的情况下,它不会影响读取该文件的能力。

话虽如此,请不要使用MODE_WORLD_READABLEUse FileProvider instead,因此您可以更精细地控制谁可以访问该内容。这样,例如,对于特定的共享操作,您可以让文件完全无法访问除了

【讨论】:

  • 我想确认我理解你。我指的是developer.android.com/training/sharing/… 的第二个选项(“将数据写入您自己的应用程序目录中的文件”)。但是您建议第五个解决方案(“将数据存储在您自己的 ContentProvider 中”)是一个更好的解决方案。如果有问题的文件只是一个导出的文件,并且在共享完成后会被删除,您是否仍然建议第五个解决方案比(更简单的)第二个解决方案更好?
  • @Calaf:“如果有问题的文件只是一个导出的文件,并且在共享完成后将被删除,您是否仍然建议第五个解决方案比(更简单的)第二个解决方案更好?” -- 请记住,您不知道“共享何时完成”。可能需要几秒钟;可能需要几天时间。您根本不会被告知用户是否“共享”了它,或者何时会发生“共享”。您需要在用户认为合理的时间内保留文件,这可能比您想象的要长。
  • @Calaf:无论如何,我都会使用FileProvider 而不是MODE_WORLD_READABLE,但额外安全性的价值会随着文件对不法分子可用的每一毫秒而攀升。
【解决方案2】:

我认为手动引用不正确。无论其模式如何,其他应用程序都无法读取内部存储中的文件。您遇到的困惑并不少见,这就是为什么应用程序应该使用 FileProvider 向其他应用程序提供文件的原因。

这是一个安全问题:文件系统权限不能充分保护数据。要通过文件权限将文件提供给另一个应用程序,您必须设置相当于 chmod a+r (至少)。这提供了对任何其他应用程序的读取权限,这是对任何 Tom、Dick 或 Harry 开始啜饮您文件的邀请。此外,访问更改是永久性的,除非您记得将其更改回来。

相比之下,使用带有 FileProvider 的 URI 权限仅提供临时读取访问权限,并且仅对请求它的特定应用程序提供。您可以设置您的应用程序,以便仅在用户访问您的应用程序请求文件时授予访问权限;至少,用户知道请求文件的应用程序和拥有文件的应用程序。

【讨论】:

  • "其他应用程序无法读取内部存储中的文件,无论其模式如何。"我看到 MODE_WORLD_READABLE 已被弃用,但并没有运行它(但是 unkosher)意味着它是通过 chmod a+r 实现的?如果该目录确实仍然是 chmod a+x(上面 Pietu1998 引用的stackoverflow.com/a/14257260/704972)——换句话说,其中的文件只有在它们的名字已知的情况下才能被访问——那么汤姆、迪克或哈利都没有访问权限,除非他们找到首先出文件名。即便如此,他们也可以读取但不能覆盖。
  • "其他应用程序无法读取内部存储中的文件,无论其模式如何。"至少对于大多数当前安装的基础来说是不真实的。 “要通过文件权限将文件提供给另一个应用程序,您必须设置相当于 chmod a+r”,这正是模式设置所做的。
  • @Calaf - 你基本上是正确的,但假设没有人能猜出文件名是有风险的。特别是,一个甚至会尝试访问和利用某些东西的应用程序很可能专门针对给定应用程序的数据文件,因此是利用通过反编译/研究目标应用程序获得的知识编写的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 2010-10-14
相关资源
最近更新 更多