mirror of
https://github.com/miniflux/v2.git
synced 2025-08-01 17:38:37 +00:00
feat(mediaProxy): implement referer spoofing for restricted media resources
This commit is contained in:
parent
051bdecabd
commit
469f23968e
2 changed files with 46 additions and 0 deletions
|
@ -3,6 +3,8 @@
|
||||||
|
|
||||||
package rewrite // import "miniflux.app/v2/internal/reader/rewrite"
|
package rewrite // import "miniflux.app/v2/internal/reader/rewrite"
|
||||||
|
|
||||||
|
import "regexp"
|
||||||
|
|
||||||
// List of predefined rewrite rules (alphabetically sorted)
|
// List of predefined rewrite rules (alphabetically sorted)
|
||||||
// Available rules: "add_image_title", "add_youtube_video"
|
// Available rules: "add_image_title", "add_youtube_video"
|
||||||
// domain => rule name
|
// domain => rule name
|
||||||
|
@ -38,3 +40,42 @@ var predefinedRules = map[string]string{
|
||||||
"xkcd.com": "add_image_title",
|
"xkcd.com": "add_image_title",
|
||||||
"youtube.com": "add_youtube_video",
|
"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 ""
|
||||||
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@ import (
|
||||||
"miniflux.app/v2/internal/http/request"
|
"miniflux.app/v2/internal/http/request"
|
||||||
"miniflux.app/v2/internal/http/response"
|
"miniflux.app/v2/internal/http/response"
|
||||||
"miniflux.app/v2/internal/http/response/html"
|
"miniflux.app/v2/internal/http/response/html"
|
||||||
|
"miniflux.app/v2/internal/reader/rewrite"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (h *handler) mediaProxy(w http.ResponseWriter, r *http.Request) {
|
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")
|
req.Header.Set("Connection", "close")
|
||||||
|
|
||||||
|
if referer := rewrite.GetRefererForURL(mediaURL); referer != "" {
|
||||||
|
req.Header.Set("Referer", referer)
|
||||||
|
}
|
||||||
|
|
||||||
forwardedRequestHeader := []string{"Range", "Accept", "Accept-Encoding", "User-Agent"}
|
forwardedRequestHeader := []string{"Range", "Accept", "Accept-Encoding", "User-Agent"}
|
||||||
for _, requestHeaderName := range forwardedRequestHeader {
|
for _, requestHeaderName := range forwardedRequestHeader {
|
||||||
if r.Header.Get(requestHeaderName) != "" {
|
if r.Header.Get(requestHeaderName) != "" {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue