我正在构建的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
答案 0 :(得分:0)
您有两个基本选择:
最好的办法是将它们上传到服务器上的非Web访问专用目录。然后,设置路由和控制器操作以在sending the file之前对用户进行身份验证。这将确保只有经过身份验证的用户才能访问自己的文件。您可以使用X-Sendfile
阻止文件传送在应用服务器上占用整个线程,以便与您的Web服务器一起使用。
第二个不太安全的选项是在某种程度上混淆目录。它将涉及在模型上设置一个guid,并执行以下操作:
"uploads/#{model.class.to_s.underscore}/#{model.guid}/#{mounted_as}/#{model.id}"
这不能确保未经授权的用户被限制访问该文件,但它确实使得某人偶然发现该路径的可能性大大降低。只有在绝对必须完全限制对文件的访问时才应考虑此方法。