我想这样做,以便我的carrierwave上传器在存储文件时加密文件,然后在检索文件时对其进行解密。
我的第一个想法是重写CarrierWave :: Uploader :: Store :: store!和CarrierWave :: Uploader :: Store :: retrieve_from_store!方法,包括我的加密和解密代码,但我不太确定如何做到这一点?
我打算使用Blowfish加密。
存储
def store!(new_file=nil)
# seems like I should process new_file here
cache!(new_file) if new_file && ((@cache_id != parent_cache_id) || @cache_id.nil?)
if @file and @cache_id
with_callbacks(:store, new_file) do
new_file = storage.store!(@file)
@file.delete if (delete_tmp_file_after_storage && ! move_to_store)
delete_cache_id
@file = new_file
@cache_id = nil
end
end
end
从商店检索
def retrieve_from_store!(identifier)
with_callbacks(:retrieve_from_store, identifier) do
res = storage.retrieve!(identifier)
@file = res #process res before I store it to file?
end
end
任何提示都将不胜感激。
答案 0 :(得分:0)
你总是可以做这样的事情,文件实际上并没有存储在公共目录中。这样可以防止网络抓取工具或某人猜测文件名并下载您的文件
def store_dir
"/path_to_rails_app/uploads/#{model.user_id}/#{model.id}"
end
从这里,您可以使用download
方法和授权工具来查看用户是否有权下载。关于vunerabilities的任何想法?除了Mass Assignment或对机器的物理访问外,我认为这不是什么大问题。您还需要将cache_dir
设置为公众之外的其他内容。
def cache_dir
"/path_to_rails_app/tmp/uploads/cache/#{model.user_id}/#{model.id}"
end