a802159a65
Vorher: _is_url_safe blockierte nur IP-Literale und 5 feste Hostnamen. Interne Servicenamen (postgres, redis, ...) und externe Domains mit privater DNS-Aufloesung passierten ungeprueft (Astra-Repro: http://postgres:5432/ wurde akzeptiert). Fix: Der Hostname wird per socket.getaddrinfo aufgeloest und ALLE aufgeloesten IPs muessen oeffentlich sein (private/loopback/link-local/ reserved/multicast/unspecified → blockiert). DNS-Fehler ist fail-closed (nicht verifizierbar = blockiert). Blocking-DNS ist hier vertretbar — Workflow-Steps sind Background-Jobs. Redirects bleiben deaktiviert (follow_redirects=False, war bereits korrekt). Abnahme (Astra): Interne Servicenamen, private DNS-Ziele und DNS-Wechsel werden abgefangen — erfuellt (Tests mit getaddrinfo-Mocks: postgres->172.18.0.2 blockiert, evil-corp.example->10.0.0.5 blockiert, DNS-Fehler blockiert). Tests: test_phase_g_workflows.py SSRF 11/11 (3 neue F15-Tests + Positivfall auf aufladbaren Host umgestellt, unresolvable Hostnamen jetzt fail-closed). ruff clean.