From 4a105d6ba6ba726a22840bac6d2b8313d707efbc Mon Sep 17 00:00:00 2001 From: Darren VanBuren Date: Wed, 21 Dec 2016 23:01:52 -0800 Subject: [PATCH] First shot at using regex for referrer check to improve situation on gochan.org --- src/server.go | 28 ++++++++++++++++++++-------- src/types.go | 5 +++++ 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/server.go b/src/server.go index e082e4e3..c79efa97 100755 --- a/src/server.go +++ b/src/server.go @@ -10,18 +10,20 @@ import ( "net/url" "os" "path" + "regexp" "strconv" "strings" ) var ( - form url.Values - header http.Header - cookies []*http.Cookie - writer http.ResponseWriter - request http.Request - exit_error bool - server *GochanServer + form url.Values + header http.Header + cookies []*http.Cookie + writer http.ResponseWriter + request http.Request + exit_error bool + server *GochanServer + referrerRegex *regexp.Regexp ) type GochanServer struct { @@ -179,7 +181,17 @@ func getRealIP(r *http.Request) (ip string) { } func validReferrer(request http.Request) (valid bool) { - valid = !(request.Referer() == "" || len(request.Referer()) < len(config.SiteDomain) || request.Referer()[7:len(config.SiteDomain)+7] != config.SiteDomain) + if referrerRegex == nil { + referrerRegex, err := regexp.Compile(config.DomainRegex) + if err != nil || referrerRegex == nil { + valid = false + return + } + } + + valid = referrerRegex.MatchString(request.Referer()) + // Old Referrer check. + // valid = !(request.Referer() == "" || len(request.Referer()) < len(config.SiteDomain) || request.Referer()[7:len(config.SiteDomain)+7] != config.SiteDomain) return } diff --git a/src/types.go b/src/types.go index 06132d4a..f7dbe1df 100644 --- a/src/types.go +++ b/src/types.go @@ -293,6 +293,7 @@ type GochanConfig struct { SiteHeaderURL string SiteWebfolder string SiteDomain string + DomainRegex string Styles_img []string DefaultStyle_img string @@ -481,6 +482,10 @@ func initConfig() { os.Exit(2) } + if config.DomainRegex == "" { + config.DomainRegex = "/(https|http):\\/\\/(" + config.SiteDomain + ")\\/(.*)/" + } + if config.Styles_img == nil { println(0, "Styles_img not set in gochan.json, halting.") os.Exit(2)