Skip to content

Commit da8638a

Browse files
committed
fix: RSS取得処理のセキュリティ改善
- SSRF対策として Net::HTTP + URL検証を導入 - open-uri の利用を廃止し safe_open メソッドを追加
1 parent bdf1337 commit da8638a

File tree

1 file changed

+23
-10
lines changed

1 file changed

+23
-10
lines changed

lib/tasks/fetch_news.rake

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,23 @@
11
require 'rss'
2-
require 'open-uri'
2+
require 'net/http'
3+
require 'uri'
34
require 'yaml'
45
require 'time'
56
require 'active_support/broadcast_logger'
67

8+
def safe_open(url)
9+
uri = URI.parse(url)
10+
unless uri.is_a?(URI::HTTP) || uri.is_a?(URI::HTTPS)
11+
raise "不正なURLです: #{url}"
12+
end
13+
14+
Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
15+
request = Net::HTTP::Get.new(uri)
16+
response = http.request(request)
17+
response.body
18+
end
19+
end
20+
721
namespace :news do
822
desc 'RSS フィードから最新ニュースを取得し、db/news.yml に書き出す'
923
task fetch: :environment do
@@ -37,15 +51,14 @@ namespace :news do
3751
new_items = feed_urls.flat_map do |url|
3852
logger.info("Fetching RSS → #{url}")
3953
begin
40-
URI.open(url) do |rss|
41-
feed = RSS::Parser.parse(rss, false)
42-
feed.items.map do |item|
43-
{
44-
'url' => item.link,
45-
'title' => item.title,
46-
'published_at' => item.pubDate.to_s
47-
}
48-
end
54+
rss = safe_open(url)
55+
feed = RSS::Parser.parse(rss, false)
56+
feed.items.map do |item|
57+
{
58+
'url' => item.link,
59+
'title' => item.title,
60+
'published_at' => item.pubDate.to_s
61+
}
4962
end
5063
rescue => e
5164
logger.warn("⚠️ Failed to fetch #{url}: #{e.message}")

0 commit comments

Comments
 (0)