我们正在使用refile来允许用户将图像上传到我们的 S3 后端。此外,我们允许用户选择输入 Internet 上任何图像的 URL(通过remote_image_url
属性)。
只要输入的 URL 指向一个实际的文件,它就可以正常工作。但是,如果 URL 有错误,或者给出了一些无意义的输入,Refile
则会抛出以下异常:
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.0
和Refile 0.5.3
.
编辑:
我已确认此异常是较低级别的SystemCallError
,来自Kernel.open
,并且此异常类型没有被 Refile 抢救:
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 gem 具有将提供 URL 并上传远程文件的功能。这可以通过
remote_image_url
在表单中添加一个字段来完成,其中image
是附件的名称。此功能使用 open-uri 发出此 HTTP 请求,而无需验证传递的 URI。攻击者可以制作一个在主机上执行任意 shell 命令的 URI。
如果您使用Refile
版本0.5.0
- 0.5.3
,请升级到最新版本。升级也将解决上述问题。