Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails中的文件存储库_Ruby On Rails_Ruby_File_Repository - Fatal编程技术网

Ruby on rails RubyonRails中的文件存储库

Ruby on rails RubyonRails中的文件存储库,ruby-on-rails,ruby,file,repository,Ruby On Rails,Ruby,File,Repository,我想在RubyonRails中创建一个简单的文件存储库。用户拥有自己的帐户,登录后可以上传文件或下载以前上传的文件 这里的问题是安全问题。文件应该是安全的,除了所有者之外,任何人都不能使用 我应该将文件存储在哪里、哪个文件夹中,以使其尽可能安全 重命名上传的文件、将名称存储在数据库中并在需要时恢复它们,这有意义吗?这可能有助于避免名称冲突,尽管我不确定这是否是个好主意 文件应该全部存储在一个文件夹中,还是应该进行一些划分 对于简单的情况(您不想分发文件存储): 将文件存储在tmp目录中。不要将它

我想在RubyonRails中创建一个简单的文件存储库。用户拥有自己的帐户,登录后可以上传文件或下载以前上传的文件

这里的问题是安全问题。文件应该是安全的,除了所有者之外,任何人都不能使用

  • 我应该将文件存储在哪里、哪个文件夹中,以使其尽可能安全
  • 重命名上传的文件、将名称存储在数据库中并在需要时恢复它们,这有意义吗?这可能有助于避免名称冲突,尽管我不确定这是否是个好主意
  • 文件应该全部存储在一个文件夹中,还是应该进行一些划分
  • 对于简单的情况(您不想分发文件存储):

  • 将文件存储在
    tmp
    目录中。不要将它们存储在
    public
    中。然后仅通过执行身份验证/授权检查的路由和控制器公开这些文件

  • 我看不出有任何理由重命名这些文件;您可以根据用户ID将它们划分为子目录。但是,如果您希望允许上载具有相同名称的文件,则可能需要为每个文件名生成唯一的哈希或其他内容

  • 见上文。你可以用任何你认为合适的方式来划分它们。但我绝对建议对它们进行分区,而不是将它们集中在一个目录中


  • 这是一个有趣的问题。根据您要应用的安全级别,我建议如下:

  • 选择仅可由应用服务器访问的文件夹(如果您选择存储在FS中)

  • 我总是建议将文件重命名为随机生成的散列(或增量生成的名称,如URL缩写中使用的名称,请参阅rubyurl的开源实现)。但是,我不会将它们存储在数据库中,因为文件系统是为处理文件而构建的,所以让它来完成这项工作。您应该将元数据存储在数据库中,以便在用户下载文件时能够设置正确的文件名

  • 您应该在多个文件夹中对文件进行分区。这给了你多种优势。首先,构建文件系统不是为了在单个文件夹中处理数百万个文件。如果您的操作试图从一个文件夹中获取所有文件,这将花费更多的时间。如果混淆原始文件名,则可以为文件名中的每个字母创建一个目录,并且可以在每个目录中获得相当多的分布式文件

  • 最后要考虑的是文件名可能发生的冲突。用户不能从其他用户那里猜出文件名。所以您可能需要在这里进行一些额外的检查


    根据您想要达到的安全级别,您可以应用越来越多的模式。

    只是不要将文件保存在公用文件夹中,而是创建一个将发送文件的控制器

    从那时起,你想如何组织是你的选择。您可以为每个用户创建一个子文件夹。从安全角度来看,不需要重命名,但一定要尝试清除文件名、空格和非ascii字符,这会使事情变得更困难。

    • 重命名这些文件,原因之一是,您无法知道今天的文件“test”是否应该替换上周的“test”(可能用户将它们放在不同的目录中)
    • 为每个用户提供自己的目录,这样可以防止性能问题,并便于迁移、归档或删除单个用户
    • 将元数据放入数据库,将文件放入文件系统
    • 注意通过文件名进行代码注入

    听起来像是经验的声音。:-)我还想补充一点,它可能有助于清理文件名。不幸的是,文件名不是所有操作系统都能接受的。我不确定我会使用
    tmp
    。我会创建一个单独的分区,最好安装在一个单独的驱动器上,这样可以方便地进行扩展<代码>tmp用于临时存储。