保护用户文件

时间:2015-08-12 03:52:02

标签: ruby-on-rails ruby carrierwave

我正在构建的Rails应用程序中有一个文件管理系统(在本地运行)。用户可以创建笔记和上传文档。 Carrierwave允许用户上传附件,附件获取user_id(视图仅显示用户文档)。简单表单允许用户在不同视图中创建注释,注释也会获得该user_id。

问题:如果我查看注释的网址隐身,我收到错误没有路由匹配[GET]“notes / x”(这很好,因为我们只希望用户看到他们的备注),但如果我查看文档的网址隐身我可以看到它(因为它位于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

1 个答案:

答案 0 :(得分:0)

您有两个基本选择:

最好的办法是将它们上传到服务器上的非Web访问专用目录。然后,设置路由和控制器操作以在sending the file之前对用户进行身份验证。这将确保只有经过身份验证的用户才能访问自己的文件。您可以使用X-Sendfile阻止文件传送在应用服务器上占用整个线程,以便与您的Web服务器一起使用。

第二个不太安全的选项是在某种程度上混淆目录。它将涉及在模型上设置一个guid,并执行以下操作:

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

这不能确保未经授权的用户被限制访问该文件,但它确实使得某人偶然发现该路径的可能性大大降低。只有在绝对必须完全限制对文件的访问时才应考虑此方法。