当前位置:  开发笔记 > 后端 > 正文

安全地显示上传了paperclip gem的图像

如何解决《安全地显示上传了paperclipgem的图像》经验,为你挑选了1个好方法。

默认情况下:paperclip gem存储公共目录中的所有附件.

出于安全原因,我不想将附件存储在公共目录中,因此我将它们保存uploads在应用程序根目录下的目录中:

class Post < ActiveRecord::Base
  belongs_to :user

  has_attached_file :some_image, path: ":rails_root/uploads/:attachment/:id/:style/:filename"
  do_not_validate_attachment_file_type :some_image
end

我没有指定url选项,因为我不想为每个图像附件添加网址.如果指定了url:那么具有该url的任何人都可以访问该图像.这不安全.

user#show页面中:我想实际显示图像.如果我使用所有的回形针默认值,那么我可以这样做,因为图像在公共目录中,图像将有一个网址:

Some image: <%= image_tag @post.some_image %>

看来如果我将图像附件保存在公共目录之外并且没有指定URL(再次:这样做以保护图像),那么图像将不会在视图中呈现.

我知道如何通过pundit gem 在整个应用程序中进行授权.但是,当该图像可公开访问时,授权图像是无用的.因此,我尝试通过删除URL并将图像保存在公共目录之外来使图像无法公开访问,但随后图像不再在视图中呈现.

更新:我的问题归结为:我的图像保存在我的rails应用程序中.使用回形针:有没有办法在视图中安全地显示图像?换句话说:设置它使图像没有自己独立的URL(因为带有该URL的任何人都可以访问该图像,使该图像不安全).以下是安全显示图像的一些示例:

示例#1:仅在用户登录时显示图像.(图像没有自己独立的URL,因此没有其他方法可以访问图像)

示例#2:仅在用户与此图像关联时显示图像.(图像没有自己独立的网址,因此没有其他方法可以访问图像)

其他更新:我知道我可以安全地发送一个send_file允许用户下载图像的文件,但这不是我想要做的.我不希望用户下载图像.相反:我希望用户能够在网页上实际看到图像.我想在页面上安全地显示/渲染图像.使用send_file(据我所知)允许用户下载文件.它不会在页面上呈现图像.



1> hedgesky..:

你可以用send_file.假设你secure_image的路线有动作:

resources :posts do
  member do
    get :secure_image
  end
end

以及相应控制器中的跟随方法:

def secure_image
  send_file Post.find(params[:id]).some_image.path
end

您可以在视图中使用受保护的图像:

<%= image_tag secure_image_post_path(@post) %>

这里发生了什么:通常轨(或nginx或者apache)将静态文件直接绕过安全检查的速度的缘故.但是请求secure_image操作遍历整个Rails的堆栈,因此它受到您的身份验证系统的保护.


另外看一下nginx的`X-Accel-Redirect`功能 - 结合`send_file`,可以在安全检查后仍然处理实际的文件上传,这样更快.
推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有