56 lines
1.5 KiB
Go
56 lines
1.5 KiB
Go
package safedial
|
|||
|
|
|
||
|
|
import (
|
||
|
|
"net"
|
||
|
|
"net/http"
|
||
|
|
"net/http/httptest"
|
||
|
|
"testing"
|
||
|
|
"time"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestBlockedCoversTheInside(t *testing.T) {
|
||
|
|
blocked := []string{
|
||
|
|
"127.0.0.1", "::1", "0.0.0.0",
|
||
|
|
// Skyens metadata-endepunkt. Den ene adresse, enhver SSRF sigter efter.
|
||
|
|
"169.254.169.254",
|
||
|
|
"10.0.0.5", "172.16.0.1", "192.168.1.10", "fd00::1", "fe80::1",
|
||
|
|
}
|
||
|
|
for _, s := range blocked {
|
||
|
|
if !Blocked(net.ParseIP(s)) {
|
||
|
|
t.Errorf("Blocked(%s) = false", s)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
for _, s := range []string{"93.184.216.34", "8.8.8.8", "2606:2800:220:1:248:1893:25c8:1946"} {
|
||
|
|
if Blocked(net.ParseIP(s)) {
|
||
|
|
t.Errorf("Blocked(%s) = true, men det er en almindelig adresse", s)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// En httptest-server lytter på loopback, hvilket gør den til den perfekte prøve:
|
||
|
|
// den findes, den svarer, og den må ikke kunne nås.
|
||
|
|
func TestClientRefusesLoopback(t *testing.T) {
|
||
|
|
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||
|
|
t.Error("forbindelsen blev oprettet; den skulle være afvist")
|
||
|
|
}))
|
||
|
|
defer srv.Close()
|
||
|
|
|
||
|
|
_, err := Client(3 * time.Second).Get(srv.URL)
|
||
|
|
if err == nil {
|
||
|
|
t.Fatal("en forespørgsel til loopback skal afvises")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestAllowPrivateStillReaches(t *testing.T) {
|
||
|
|
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||
|
|
w.WriteHeader(http.StatusNoContent)
|
||
|
|
}))
|
||
|
|
defer srv.Close()
|
||
|
|
|
||
|
|
resp, err := AllowPrivate(3 * time.Second).Get(srv.URL)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("den skal kunne nå det, operatøren selv har peget på: %v", err)
|
||
|
|
}
|
||
|
|
resp.Body.Close()
|
||
|
|
}
|