保护用户文件

Securing Users Files

我正在构建的 Rails 应用程序中有一个文件管理系统(运行 本地)。用户可以创建笔记和上传文档。 Carrierwave 允许用户上传附件,附件得到 user_id (视图只显示用户文档)。 Simple Form 允许用户在不同的视图中创建笔记,并且笔记也得到 user_id。

问题: 如果我查看笔记的 url 隐身,我得到一个错误 No Route matches [GET] "notes/x" (这很好因为我们只希望用户看到他们的笔记),但是如果我查看文档的 url 隐身我可以看到它(因为它在 PUBLIC/UPLOADS/DOCUMENTS 文件夹中。

保护这些上传的最佳方法是什么?我应该在哪里存储上传的文件?

route.rb

Rails.application.routes.draw do

  devise_for :users
  get 'welcome/index'

  authenticated :user do
    root 'notes#index', as: "authenticated_root"
    resources :notes, :documents, :uploads
  end

  root 'welcome#index'

end

attachment_uploader.rb

class AttachmentUploader < CarrierWave::Uploader::Base
  storage :file

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  def extension_white_list
    %w(pdf doc htm html docx)
  end
end

您有两个基本选择:

最好的办法是将它们上传到您服务器上一个私人的、不可通过网络访问的目录中。然后,在 sending the file 之前设置一个路由和控制器操作来验证用户。这将确保只有经过身份验证的用户才能访问他们自己的文件。您可以通过使用 X-Sendfile 与您的网络服务器一起工作来防止文件传输占用您的应用程序服务器上的整个线程。

第二个不太安全的选项是稍微混淆目录。这将涉及在模型上设置一个 guid,并执行如下操作:

"uploads/#{model.class.to_s.underscore}/#{model.guid}/#{mounted_as}/#{model.id}" 

这不能确保限制未经授权的用户访问该文件,但确实可以大大降低有人偶然发现该路径的可能性。仅当完全限制对文件的访问并非绝对必要时才应考虑此方法。