外部URL / Rails 6.11 / Ruby 3没有这样的文件或目录@ rb_sysopen

dnph8jn4  于 2023-04-11  发布在  Ruby
关注(0)|答案(2)|浏览(122)

这在Rails 6中工作正常,但现在将Rails和Ruby升级到6.11和3,它会触发这个“经典”错误。简单地说,例如使用Rails控制台直接指向Firefox徽标的外部URL:

require 'open-uri'
open("https://brandemia.org/sites/default/files/inline/images/firefox_logo.jpg")
Traceback (most recent call last):
        4: from (irb):1:in `<main>'
        3: from (irb):2:in `rescue in <main>'
        2: from (irb):2:in `open'
        1: from (irb):2:in `initialize'
Errno::ENOENT (No such file or directory @ rb_sysopen - https://brandemia.org/sites/default/files/inline/images/firefox_logo.jpg)

在Rails和Ruby升级之前(Ruby 2.5.8和Rails6.0.3.1),这是完全正常的。

gzjq41n4

gzjq41n41#

在Ruby 3.0之前,open-uri使用自己的版本覆盖Kernel#open,该版本还支持从外部URL阅读,而不是简单地打开本地文件或运行命令。
然而,混合这两种用例是非常危险的,并且如果不能确保传递的URL在任何地方都是安全的(包括使用Kernel#open的第三方代码),则可能存在严重的漏洞。
因此,这种覆盖Kernel#open的行为在Ruby 2.7中被弃用,最终在Ruby 3.0中被删除。要打开外部URL,可以使用以下代码:

URI.open("https://brandemia.org/sites/default/files/inline/images/firefox_logo.jpg")
p1tboqfb

p1tboqfb2#

我不知道这个变化是从哪里来的,但是。

require 'open-uri'

uri = 'https://brandemia.org/sites/default/files/inline/images/firefox_logo.jpg'
URI.open(uri) # ! instead of open without URI

应该可以

更新open-uri在3.0版本之前确实声明了Kernel#open。显然在2.7版本中已经弃用了。从现在开始,你需要调用URI.open。请在这里查看提交:https://github.com/ruby/open-uri/commit/53862fa35887a34a8060aebf2241874240c2986a

相关问题