package main import ( "net/http/httptest" "strings" "testing" ) // TestSafeReturn deckt die Open-Redirect-Abwehr ab. Jede hier durchgelassene // Eingabe landet später in einem Location-Header -- die abgelehnten Fälle sind // deshalb wichtiger als die erlaubten. func TestSafeReturn(t *testing.T) { const fallback = "/" erlaubt := []string{ "/", "/u/alice", "/u/alice?page=3", "/?page=2#e123", "/u/alice?q=%22katzen%22&page=1#e42", "/e/123", } for _, v := range erlaubt { if got := safeReturn(v, fallback); got != v { t.Errorf("safeReturn(%q) = %q, erwartet unverändert", v, got) } } abgelehnt := map[string]string{ "leer": "", "protokoll-relativ": "//evil.example/x", "drei slashes": "///evil.example", "backslash-variante": `/\evil.example`, "absolute https": "https://evil.example", "absolute http": "http://evil.example", "javascript-schema": "javascript:alert(1)", "data-schema": "data:text/html,