mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2025-08-20 08:53:33 +08:00
remove spoof-able request header (#7103)
* remove spoof-able request header https://github.com/seaweedfs/seaweedfs/issues/7094#issuecomment-3158320497 * Update weed/security/guard.go Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
parent
0703308270
commit
e446234e9c
@ -77,34 +77,8 @@ func (g *Guard) WhiteList(f http.HandlerFunc) http.HandlerFunc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func GetActualRemoteHost(r *http.Request) string {
|
func GetActualRemoteHost(r *http.Request) string {
|
||||||
// Check X-Forwarded-For headers first (may contain comma-separated IPs)
|
// For security reasons, only use RemoteAddr to determine the client's IP address.
|
||||||
// HTTP_X_FORWARDED_FOR is used for SeaweedFS internal communication when master proxies to leader
|
// Do not trust headers like X-Forwarded-For, as they can be easily spoofed by clients.
|
||||||
host := r.Header.Get("HTTP_X_FORWARDED_FOR")
|
|
||||||
if host == "" {
|
|
||||||
host = r.Header.Get("X-FORWARDED-FOR")
|
|
||||||
}
|
|
||||||
if host != "" {
|
|
||||||
for _, ipStr := range strings.Split(host, ",") {
|
|
||||||
host = strings.TrimSpace(ipStr)
|
|
||||||
if host != "" {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If no valid IP from X-Forwarded-For, try X-Real-IP (single IP)
|
|
||||||
if host == "" {
|
|
||||||
host = r.Header.Get("X-Real-IP")
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we got a host from headers, use it (can be IP or hostname)
|
|
||||||
if host != "" {
|
|
||||||
if host = strings.TrimSpace(host); host != "" {
|
|
||||||
return host
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If no host from headers, extract from RemoteAddr
|
|
||||||
host, _, err := net.SplitHostPort(r.RemoteAddr)
|
host, _, err := net.SplitHostPort(r.RemoteAddr)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return host
|
return host
|
||||||
|
|||||||
@ -257,12 +257,6 @@ func (ms *MasterServer) proxyToLeader(f http.HandlerFunc) http.HandlerFunc {
|
|||||||
// proxy to leader
|
// proxy to leader
|
||||||
glog.V(4).Infoln("proxying to leader", raftServerLeader)
|
glog.V(4).Infoln("proxying to leader", raftServerLeader)
|
||||||
proxy := httputil.NewSingleHostReverseProxy(targetUrl)
|
proxy := httputil.NewSingleHostReverseProxy(targetUrl)
|
||||||
director := proxy.Director
|
|
||||||
proxy.Director = func(req *http.Request) {
|
|
||||||
actualHost := security.GetActualRemoteHost(req)
|
|
||||||
req.Header.Set("HTTP_X_FORWARDED_FOR", actualHost)
|
|
||||||
director(req)
|
|
||||||
}
|
|
||||||
proxy.Transport = util_http.GetGlobalHttpClient().GetClientTransport()
|
proxy.Transport = util_http.GetGlobalHttpClient().GetClientTransport()
|
||||||
proxy.ServeHTTP(w, r)
|
proxy.ServeHTTP(w, r)
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user