From 469f23968e296291ad4d809c7b1aa7fb1591b80d Mon Sep 17 00:00:00 2001 From: AiraNadih <128119996+AiraNadih@users.noreply.github.com> Date: Wed, 30 Oct 2024 01:08:31 +0800 Subject: [PATCH] feat(mediaProxy): implement referer spoofing for restricted media resources --- internal/reader/rewrite/rules.go | 41 ++++++++++++++++++++++++++++++++ internal/ui/proxy.go | 5 ++++ 2 files changed, 46 insertions(+) diff --git a/internal/reader/rewrite/rules.go b/internal/reader/rewrite/rules.go index 081b5c9a..35ebea11 100644 --- a/internal/reader/rewrite/rules.go +++ b/internal/reader/rewrite/rules.go @@ -3,6 +3,8 @@ package rewrite // import "miniflux.app/v2/internal/reader/rewrite" +import "regexp" + // List of predefined rewrite rules (alphabetically sorted) // Available rules: "add_image_title", "add_youtube_video" // domain => rule name @@ -38,3 +40,42 @@ var predefinedRules = map[string]string{ "xkcd.com": "add_image_title", "youtube.com": "add_youtube_video", } + +type RefererRule struct { + URLPattern *regexp.Regexp + Referer string +} + +// List of predefined referer rules +var PredefinedRefererRules = []RefererRule{ + { + URLPattern: regexp.MustCompile(`^https://\w+\.sinaimg\.cn`), + Referer: "https://weibo.com", + }, + { + URLPattern: regexp.MustCompile(`^https://i\.pximg\.net`), + Referer: "https://www.pixiv.net", + }, + { + URLPattern: regexp.MustCompile(`^https://cdnfile\.sspai\.com`), + Referer: "https://sspai.com", + }, + { + URLPattern: regexp.MustCompile(`^https://(?:\w|-)+\.cdninstagram\.com`), + Referer: "https://www.instagram.com", + }, + { + URLPattern: regexp.MustCompile(`^https://sp1\.piokok\.com`), + Referer: "https://sp1.piokok.com", + }, +} + +// GetRefererForURL returns the referer for the given URL if it exists, otherwise an empty string. +func GetRefererForURL(url string) string { + for _, rule := range PredefinedRefererRules { + if rule.URLPattern.MatchString(url) { + return rule.Referer + } + } + return "" +} diff --git a/internal/ui/proxy.go b/internal/ui/proxy.go index 4e54e1ff..a1984375 100644 --- a/internal/ui/proxy.go +++ b/internal/ui/proxy.go @@ -19,6 +19,7 @@ import ( "miniflux.app/v2/internal/http/request" "miniflux.app/v2/internal/http/response" "miniflux.app/v2/internal/http/response/html" + "miniflux.app/v2/internal/reader/rewrite" ) func (h *handler) mediaProxy(w http.ResponseWriter, r *http.Request) { @@ -90,6 +91,10 @@ func (h *handler) mediaProxy(w http.ResponseWriter, r *http.Request) { req.Header.Set("Connection", "close") + if referer := rewrite.GetRefererForURL(mediaURL); referer != "" { + req.Header.Set("Referer", referer) + } + forwardedRequestHeader := []string{"Range", "Accept", "Accept-Encoding", "User-Agent"} for _, requestHeaderName := range forwardedRequestHeader { if r.Header.Get(requestHeaderName) != "" {