Pārlūkot izejas kodu

feat(mediaProxy): implement referer spoofing for restricted media resources

AiraNadih 1 gadu atpakaļ
vecāks
revīzija
469f23968e
2 mainītis faili ar 46 papildinājumiem un 0 dzēšanām
  1. 41 0
      internal/reader/rewrite/rules.go
  2. 5 0
      internal/ui/proxy.go

+ 41 - 0
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 ""
+}

+ 5 - 0
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) != "" {