首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >重新文件Gem:当remote_image_url无效或不存在时忽略异常

重新文件Gem:当remote_image_url无效或不存在时忽略异常
EN

Stack Overflow用户
提问于 2015-03-29 08:52:33
回答 1查看 329关注 0票数 1

我们使用重编允许用户将图像上传到我们的S3后端。此外,我们允许用户在互联网上(通过remote_image_url属性)输入任何图像的网址。

只要输入的URL指向实际文件,就可以正常工作。但是,如果URL中有错误,或者提供了一些无意义的输入,Refile将抛出以下异常:

代码语言:javascript
复制
Errno::ENOENT (No such file or directory @ rb_sysopen - thiswillnotwork):
  app/controllers/my/deals_controller.rb:17:in `create'
  appsignal (0.11.2) lib/appsignal/rack/listener.rb:13:in `call'

是否有一个选项可以忽略URL输入无效的情况(类似于validate_download选项在CarrierWave中的工作方式),并在理想情况下使用我们的后退图像?

我们尝试过将raise_errors选项设置为false,但是结果是相同的。

我们的项目使用Rails 4.2.0Refile 0.5.3

编辑:

我已经确认此异常是来自Kernel.open的较低级别的Kernel.open,并且该异常类型不会被重新文件拯救:

代码语言:javascript
复制
rescue OpenURI::HTTPError, RuntimeError => error
  raise if error.is_a?(RuntimeError) and error.message !~ /redirection loop/
  @errors = [:download_failed]
  raise if @raise_errors
end

我正在处理一个请求重新提交来修复这个问题。

编辑2:

在进行此操作时,我们在Refile中发现了一个Refile,使潜在的攻击者能够使用远程代码执行。

重新文件创业板有一个特性,其中将提供一个URL和远程文件将被上传。这可以通过在表单中添加像remote_image_url这样的字段来实现,其中image是附件的名称。该特性使用open来发出HTTP请求,而不验证传递的URI。攻击者可以创建一个URI,该URI在主机上执行任意shell命令。

如果您使用的是Refile版本的0.5.0 - 0.5.3,请升级到最新版本.升级也将解决上述问题。

EN

Stack Overflow用户

回答已采纳

发布于 2015-04-07 06:58:15

在与Refile的维护者交谈之后,将在下一次迭代中修复这个问题。现在,我们已经创建了以下简单的Ruby类。

代码语言:javascript
复制
# app/services/remote_url.rb
class RemoteUrl
  def initialize(url)
    @url = url
  end

  def valid?
    URI.parse(@url).kind_of?(URI::HTTP)
  rescue URI::InvalidURIError
    false
  end
end

我用在我的控制器上,就像这样:

代码语言:javascript
复制
# app/controllers/model_controller.rb
def model_params
  sanitize_remote_url!
  params.require(:model).permit(:description, ..., :image, :remote_image_url)
end

def sanitize_remote_url!
  params[:model].delete(:remote_image_url) unless RemoteUrl.new(params[:model][:remote_image_url]).valid?
end

这是一种非常原始的方法,但考虑到它将在下一个Gem版本中得到修补,我认为这已经足够好了。

免责声明:

虽然这弥补了原始问题的编辑2中提到的一些漏洞,但如果攻击者能够在文件系统上创建名为http:的文件夹,攻击者仍然能够执行远程代码执行,因为像http:/../etc/passwd这样的字符串将通过http:/../etc/passwd验证,但仍然可以通过Kernel.open读取本地文件。

Gem现在已经被修补(0.5.4),升级是正确的解决方案。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29327273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档