mirror of
https://github.com/swissmakers/fail2ban-ui.git
synced 2026-04-19 06:53:14 +02:00
Add a check to validate the origin of the WebSocket connection to prevent cross-origin hijacking
This commit is contained in:
@@ -20,6 +20,8 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -55,9 +57,41 @@ const (
|
|||||||
var upgrader = websocket.Upgrader{
|
var upgrader = websocket.Upgrader{
|
||||||
ReadBufferSize: 1024,
|
ReadBufferSize: 1024,
|
||||||
WriteBufferSize: 1024,
|
WriteBufferSize: 1024,
|
||||||
CheckOrigin: func(r *http.Request) bool {
|
CheckOrigin: checkWSOrigin,
|
||||||
|
}
|
||||||
|
|
||||||
|
// =========================================================================
|
||||||
|
// WebSocket Origin Validation
|
||||||
|
// =========================================================================
|
||||||
|
|
||||||
|
// Checks the origin of the WebSocket connection to prevent cross-origin hijacking.
|
||||||
|
func checkWSOrigin(r *http.Request) bool {
|
||||||
|
origin := r.Header.Get("Origin")
|
||||||
|
if origin == "" {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
u, err := url.Parse(origin)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("WebSocket rejected: malformed Origin header %q", origin)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
reqHost := r.Host
|
||||||
|
if reqHost == "" {
|
||||||
|
reqHost = r.URL.Host
|
||||||
|
}
|
||||||
|
originHost := u.Host
|
||||||
|
if !strings.Contains(originHost, ":") && strings.Contains(reqHost, ":") {
|
||||||
|
if u.Scheme == "https" {
|
||||||
|
originHost += ":443"
|
||||||
|
} else {
|
||||||
|
originHost += ":80"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !strings.EqualFold(originHost, reqHost) {
|
||||||
|
log.Printf("WebSocket rejected: origin %q does not match host %q", origin, reqHost)
|
||||||
|
return false
|
||||||
|
}
|
||||||
return true
|
return true
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// =========================================================================
|
// =========================================================================
|
||||||
|
|||||||
Reference in New Issue
Block a user