mirror of
https://github.com/yusing/godoxy.git
synced 2025-05-19 20:32:35 +02:00
feat: add validation for localhost routes to prevent usage of godoxy port causing self recursion
This commit is contained in:
parent
a9e4f82e30
commit
c8935102c3
3 changed files with 19 additions and 3 deletions
|
@ -95,7 +95,7 @@ func GetEnvInt(key string, defaultValue int) int {
|
||||||
return GetEnv(key, defaultValue, strconv.Atoi)
|
return GetEnv(key, defaultValue, strconv.Atoi)
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetAddrEnv(key, defaultValue, scheme string) (addr, host, port, fullURL string) {
|
func GetAddrEnv(key, defaultValue, scheme string) (addr, host string, portInt int, fullURL string) {
|
||||||
addr = GetEnvString(key, defaultValue)
|
addr = GetEnvString(key, defaultValue)
|
||||||
if addr == "" {
|
if addr == "" {
|
||||||
return
|
return
|
||||||
|
@ -108,6 +108,10 @@ func GetAddrEnv(key, defaultValue, scheme string) (addr, host, port, fullURL str
|
||||||
host = "localhost"
|
host = "localhost"
|
||||||
}
|
}
|
||||||
fullURL = fmt.Sprintf("%s://%s:%s", scheme, host, port)
|
fullURL = fmt.Sprintf("%s://%s:%s", scheme, host, port)
|
||||||
|
portInt, err = strconv.Atoi(port)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal().Msgf("env %s: invalid port: %s", key, port)
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ package middleware
|
||||||
import (
|
import (
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/yusing/go-proxy/internal/common"
|
"github.com/yusing/go-proxy/internal/common"
|
||||||
|
@ -38,8 +39,8 @@ func (m *redirectHTTP) before(w http.ResponseWriter, r *http.Request) (proceed b
|
||||||
host = r.Host
|
host = r.Host
|
||||||
}
|
}
|
||||||
|
|
||||||
if common.ProxyHTTPSPort != "443" {
|
if common.ProxyHTTPSPort != 443 {
|
||||||
r.URL.Host = host + ":" + common.ProxyHTTPSPort
|
r.URL.Host = host + ":" + strconv.Itoa(common.ProxyHTTPSPort)
|
||||||
} else {
|
} else {
|
||||||
r.URL.Host = host
|
r.URL.Host = host
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,6 +75,17 @@ func (r *Route) Validate() (err gperr.Error) {
|
||||||
r.isValidated = true
|
r.isValidated = true
|
||||||
r.Finalize()
|
r.Finalize()
|
||||||
|
|
||||||
|
// return error if route is localhost:<godoxy_port>
|
||||||
|
switch r.Host {
|
||||||
|
case "localhost", "127.0.0.1":
|
||||||
|
switch r.Port.Proxy {
|
||||||
|
case common.ProxyHTTPPort, common.ProxyHTTPSPort, common.APIHTTPPort:
|
||||||
|
if r.Scheme.IsReverseProxy() || r.Scheme == types.SchemeTCP {
|
||||||
|
return gperr.Errorf("localhost:%d is reserved for godoxy", r.Port.Proxy)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
errs := gperr.NewBuilder("entry validation failed")
|
errs := gperr.NewBuilder("entry validation failed")
|
||||||
|
|
||||||
switch r.Scheme {
|
switch r.Scheme {
|
||||||
|
|
Loading…
Add table
Reference in a new issue