Ruby open-uri выдает ошибку Bad uri, когда я пытаюсь получить URL-адрес с помощью пользовательского ввода. Почему?

Этот код отлично работает, когда я указываю URL-адрес непосредственно в сценарии.

require 'nokogiri'
require 'open-uri'

get_url = "http://google.com"

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

Я попытался ввести "http://google.com" в пользовательском вводе, но это не работает и выдает неверный uri. ошибка и говорит

Нет такого файла или каталога @ rb_sysopen

require 'nokogiri'
require 'open-uri'

get_url = gets

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

Кто-нибудь может сказать мне, что я делаю неправильно? Я тоже пытаюсь поискать в Google, но прямых ответов нет.


person Meimo    schedule 24.11.2017    source источник
comment
Я не уверен, но думаю, что это, вероятно, происходит для предотвращения XSS-атак. Очень рискованно получать URL-адрес из пользовательского ввода - вы можете посмотреть методы его очистки, но то, что вы делаете, кажется мне очень рискованным.   -  person SRack    schedule 24.11.2017
comment
Должен ли я попробовать проверить это с помощью Regex перед открытием (get_url)?   -  person Meimo    schedule 24.11.2017
comment
Это потому, что вам нужно использовать gets.chomp? В вашем текущем примере кода будет завершающая новая строка.   -  person Tom Lord    schedule 24.11.2017
comment
НЕ передавайте пользовательский ввод непосредственно в open. Он также может выполнять системные команды, если ввод заключен в обратные тики. youtube.com/watch?v=djaInGGBVFQ   -  person Drenmi    schedule 24.11.2017
comment
Спасибо, что упомянули об этом @Drenmi :) Однако я знаю, что он запускает Kernel.open и может выполнять команды ... Я не буду использовать его в open: D   -  person Meimo    schedule 24.11.2017


Ответы (1)


gets добавляет новый символ строки в конец строки. Я использовал chomp для получения, чтобы удалить это ниже.

Теперь это должно работать

require 'nokogiri'
require 'open-uri'

get_url = gets.chomp

doc = Nokogiri::HTML(open(get_url))
puts doc
person Lewis Jones    schedule 24.11.2017