【问题标题】:Ruby open-uri throws an Bad uri error when I try to get a URL through user input. Why?当我尝试通过用户输入获取 URL 时,Ruby open-uri 会引发 Bad uri 错误。为什么?
【发布时间】:2017-11-24 10:28:20
【问题描述】:

当我直接在脚本中提供 URL 时,此代码可以正常工作。

require 'nokogiri'
require 'open-uri'

get_url = "http://google.com"

doc = Nokogiri::HTML(open(get_url))
puts doc

我尝试在用户输入中输入“http://google.com”,但这不起作用并引发 Bad uri 错误并显示

没有这样的文件或目录@rb_sysopen

require 'nokogiri'
require 'open-uri'

get_url = gets

doc = Nokogiri::HTML(open(get_url))
puts doc

谁能告诉我我做错了什么?我也尝试在 google 上查找,但没有直接的答案。

【问题讨论】:

  • 我不确定,但我认为这可能是为了防止 XSS 攻击。从用户输入中获取 URL 是非常冒险的 - 您可以查看对其进行清理的方法,但您正在做的事情对我来说看起来非常冒险。
  • 我应该在到达 open(get_url) 之前尝试使用 Regex 进行验证吗?
  • 是不是因为需要使用gets.chomp?当前代码示例中将有一个尾随换行符。
  • 不要将用户输入直接传递给open。如果输入包含在反引号中,它也可以执行系统命令。 youtube.com/watch?v=djaInGGBVFQ
  • 谢谢你提到这个@Drenmi :) 但是,我知道它运行 Kernel.open 并且可以执行命令的事实......我不会在 open 中使用它:D

标签: ruby-on-rails ruby nokogiri open-uri


【解决方案1】:

gets 在字符串末尾添加一个换行符。我在 get 上使用了chomp 来删除下面的内容。

现在应该可以工作了

require 'nokogiri'
require 'open-uri'

get_url = gets.chomp

doc = Nokogiri::HTML(open(get_url))
puts doc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多