我想在Ruby on Rails中创建一个简单的文件存储库。用户拥有自己的帐户,登录后可以上传文件或下载先前上传的文件。Ruby on Rails中的文件存储库
这里的问题是安全性。文件应该是安全的,除了业主以外的任何人都无法使用。
- 哪里,我应该在哪个文件夹中存储文件,以使它们尽可能安全?
- 重新命名上传的文件,将名称存储在数据库中并在需要时恢复它们是否有意义?这可能有助于避免名称冲突,但我不确定这是否是一个好主意。
- 文件是否应该全部存储在一个文件夹中,还是应该有所分割?
我想在Ruby on Rails中创建一个简单的文件存储库。用户拥有自己的帐户,登录后可以上传文件或下载先前上传的文件。Ruby on Rails中的文件存储库
这里的问题是安全性。文件应该是安全的,除了业主以外的任何人都无法使用。
对于简单的情况下(在您不希望分发的文件存储):
商店中tmp
目录中的文件。请勿将它们存储在public
中。然后只通过一个路由和控制器来进行身份验证/授权检查。
我看不到任何理由重命名文件;您可以根据用户标识将它们分成子目录。但是,如果您想允许上传具有相同名称的文件,那么您可能需要为每个文件的名称生成一个唯一的哈希值或其他值。
见上。您可以按照您认为合适的方式对其进行分区。但我肯定会建议对它们进行分区,而不是将它们集中在一个目录中。
我不确定我会用'tmp'。我会创建一个单独的分区,最好安装在一个单独的驱动器上,因此可以轻松扩展。 'tmp'用于临时存储。 – 2011-06-04 21:00:57
这是一个有趣的问题。根据安全级别要应用我想提出以下建议:
选择一个文件夹只有通过你的应用服务器进行访问(如果您选择在FS存储)
我总是建议将文件重命名为随机生成的哈希(或者像URL短缩中使用的渐进生成的名称,请参阅rubyurl的开源实现)。但是,我不会将它们存储在数据库中,因为文件系统是为处理文件而构建的,因此请让它完成这项工作。您应该将元数据存储在数据库中,以便能够在用户下载文件时设置正确的文件名。
您应该在多个文件夹之间对文件进行分区。这给你多重优势。首先,文件系统不是用来处理单个文件夹中的数百万个文件的。如果您的操作尝试从文件夹中获取所有文件,则需要更多时间。如果您对原始文件名称进行了模糊处理,则可以为文件名中的每个字母创建一个目录,并且每个目录将获得相当好的分布数量的文件。
要考虑的最后一件事是可能的文件名冲突。用户不应该能够猜测来自另一个用户的文件名。所以你可能在这里需要一些额外的检查。
根据您希望实现的安全级别,您可以应用越来越多的模式。
只是不要将文件保存在公用文件夹中,并创建一个将发送文件的控制器。
如何从这一点开始组织起来就是您的选择。您可以为每个用户创建一个子文件夹。没有必要从安全角度重新命名,但是尝试清理文件名,空格和非ASCII字符会让事情变得更加困难。
听起来像体验的声音。 :-) – 2011-06-04 20:56:28
我也会添加它可能有助于清理文件名。不幸的是文件名并不是所有操作系统都普遍接受的。 – 2011-06-04 21:05:01